Проверки при итерации массива, если текущий элемент является последним элементом
пожалуйста, помогите мне перевести этот псевдо-код в реальный PHP-код:
foreach ($arr as $k => $v)
if ( THIS IS NOT THE LAST ELEMENT IN THE ARRAY)
doSomething();
изменить: массив может иметь числовые или строковые ключи
8 ответов:
вы можете использовать PHP end ()
$array = array('a' => 1,'b' => 2,'c' => 3); $lastElement = end($array); foreach($array as $k => $v) { echo $v . '<br/>'; if($v == $lastElement) { // 'you can do something here as this condition states it just entered last element of an array'; } }
обновление 1
как указано @Mijoja выше может возникнуть проблема, если у вас есть одно и то же значение несколько раз в массиве. ниже приведено исправление для него.
$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2); //point to end of the array end($array); //fetch key of the last element of the array. $lastElementKey = key($array); //iterate the array foreach($array as $k => $v) { if($k == $lastElementKey) { //during array iteration this condition states the last element. } }
обновление 2
Я нашел решение от @onteria_, чтобы быть лучше, чем то, что я ответил, так как он не изменяет массивы внутреннего указателя, я обновляю ответ, чтобы соответствовать его ответ.
$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2); // Get array keys $arrayKeys = array_keys($array); // Fetch last array key $lastArrayKey = array_pop($arrayKeys); //iterate array foreach($array as $k => $v) { if($k == $lastArrayKey) { //during array iteration this condition states the last element. } }
спасибо @onteria_
это всегда делает трюк для меня
foreach($array as $key => $value) { if (end(array_keys($array)) == $key) // Last key reached }
изменить 30/04/15
$last_key = end(array_keys($array)); reset($array); foreach($array as $key => $value) { if ( $key == $last_key) // Last key reached }
чтобы избежать предупреждения E_STRICT, упомянутого @Warren Sergent
$array_keys = array_keys($array); $last_key = end($array_keys);
$myarray = array( 'test1' => 'foo', 'test2' => 'bar', 'test3' => 'baz', 'test4' => 'waldo' ); $myarray2 = array( 'foo', 'bar', 'baz', 'waldo' ); // Get the last array_key $last = array_pop(array_keys($myarray)); foreach($myarray as $key => $value) { if($key != $last) { echo "$key -> $value\n"; } } // Get the last array_key $last = array_pop(array_keys($myarray2)); foreach($myarray2 as $key => $value) { if($key != $last) { echo "$key -> $value\n"; } }
С
array_pop
работает над временным массивом, созданнымarray_keys
он вообще не изменяет исходный массив.$ php test.php test1 -> foo test2 -> bar test3 -> baz 0 -> foo 1 -> bar 2 -> baz
Я знаю, что это старый, и использование итератора SPL может быть просто излишним, но в любом случае, другое решение здесь:
$ary = array(1, 2, 3, 4, 'last'); $ary = new ArrayIterator($ary); $ary = new CachingIterator($ary); foreach ($ary as $each) { if (!$ary->hasNext()) { // we chain ArrayIterator and CachingIterator // just to use this `hasNext()` method to see // if this is the last element echo $each; } }
мое решение, и довольно простое..
$array = [...]; $last = count($array) - 1; foreach($array as $index => $value) { if($index == $last) // this is last array else // this is not last array }
почему бы не этот очень простой метод:
$i = 0; //a counter to track which element we are at foreach($array as $index => $value) { $i++; if( $i == sizeof($array) ){ //we are at the last element of the array } }
если элементы упорядочены численно, используйте функцию key () для определения индекса текущего элемента и сравнения его с длиной. Вам придется использовать метод next() и prev() для перебора элементов в цикле while вместо цикла for:
$length = sizeOf($arr); while (key(current($arr)) != $length-1) { $v = current($arr); doSomething($v); //do something if not the last item next($myArray); //set pointer to next item }