Интересно, что было бы хорошим способом получить первую итерацию в цикле foreach. Я хочу сделать что-то другое на первой итерации.
Является ли условным наш лучший вариант в этих случаях?
Да, если вы не можете пройти через объект по-другому (нормальный для цикла), просто используйте условное выражение в этом случае:
$first = true; foreach ( $obj as $value ) { if ( $first ) { // do something $first = false; } else { // do something } // do something }
Даже более умеренный eleganterer:
foreach($array as $index => $value) { if ($index == 0) { echo $array[$index]; } }
Этот пример работает только в том случае, если вы используете встроенные функции добавления / функции массива PHP или вручную указываете ключи в правильном числовом порядке.
Вот подход, который не похож на другие, перечисленные здесь, которые должны работать через естественный порядок любого массива PHP.
$first = array_shift($array); //do stuff with $first foreach($array as $elem) { //do stuff with rest of array elements } array_unshift($array, $first); //return first element to top
Вы можете просто добавить счетчик к началу, например:
$i = 0; foreach($arr as $a){ if($i == 0) { //do ze business } //the rest $i++; }
Я увидел это решение в блоге в моем наборе результатов поиска, который поднял этот пост, и я подумал, что он довольно изящный. Хотя, возможно, это немного тяжело для обработки.
foreach ($array as $element) { if ($element === reset($array)) echo 'FIRST ELEMENT!'; if ($element === end($array)) echo 'LAST ELEMENT!'; }
Обратите внимание, что в сообщении также есть предупреждение, что это будет работать, только если значения массива уникальны. Если ваш последний элемент – это «мир», а некоторый случайный элемент в середине – это также «мир», последний элемент будет выполняться дважды.
first = true foreach(...) if first do stuff first = false
Это также работает
foreach($array as $element) { if ($element === reset($array)) echo 'FIRST ELEMENT!'; if ($element === end($array)) echo 'LAST ELEMENT!'; }
гм
<?php $i = 0; foreach($ar as $sth) { if($i++ == 0) { // do something } // do something else }
более элегантный.