6

PHP: Как определить первую и последнюю итерацию в цикле foreach?

1

Проблема проста. У меня есть цикл foreach в моем коде:

foreach($array as $element) {
    // код
}

В этом цикле я хочу по-разному реагировать на первую и последнюю итерации.

Как мне это сделать?

5 ответ(ов)

12

Если вам нужна решение без инициализации счетчика вне цикла, вы можете сравнить текущий ключ итерации с функциями, которые возвращают первый и последний ключ массива.

PHP 7.3 и новее:

foreach ($array as $key => $element) {
    if ($key === array_key_first($array)) {
        echo 'ПЕРВЫЙ ЭЛЕМЕНТ!';
    }

    if ($key === array_key_last($array)) {
        echo 'ПОСЛЕДНИЙ ЭЛЕМЕНТ!';
    }
}

PHP 7.2 и старше:

PHP 7.2 уже устарел (end of life), поэтому это здесь только для исторической справки. Избегайте использования.

foreach ($array as $key => $element) {
    reset($array);
    if ($key === key($array)) {
        echo 'ПЕРВЫЙ ЭЛЕМЕНТ!';
    }

    end($array);
    if ($key === key($array)) {
        echo 'ПОСЛЕДНИЙ ЭЛЕМЕНТ!';
    }
}

Тем не менее, для лучшей производительности вы можете вынести эти вызовы за пределы foreach:

reset($array);
$key_first = key($array);
end($array);
$key_last = key($array);
foreach ($array as $key => $element) {
    if ($key === $key_first) {
        echo 'ПЕРВЫЙ ЭЛЕМЕНТ!';
    }

    if ($key === $key_last) {
        echo 'ПОСЛЕДНИЙ ЭЛЕМЕНТ!';
    }
}

Такой подход обеспечит более эффективное выполнение кода.

5

Вы можете использовать счётчик:

$i = 0;
$len = count($array);
foreach ($array as $item) {
    if ($i == 0) {
        // это первый элемент
    } else if ($i == $len - 1) {
        // это последний элемент
    }
    // …
    $i++;
}

Такой подход позволяет определить, является ли текущий элемент первым или последним в массиве.

1

Чтобы найти последний элемент, я обнаружил, что этот фрагмент кода работает каждый раз:

foreach( $items as $item ) {
    if( !next( $items ) ) {
        echo 'Последний элемент';
    }
}

Этот код перебирает все элементы массива $items и проверяет, является ли текущий элемент последним, используя функцию next(). Если next() возвращает false, это значит, что текущий элемент - последний в коллекции. Обратите внимание, что данное решение может изменить внутренний указатель массива, поэтому если вам требуется сохранить оригинальный порядок, вы можете рассмотреть альтернативные подходы, такие как использование end() для достижения последнего элемента массива.

1

Вот более упрощённая версия вашего кода, предполагая, что вы не используете пользовательские индексы:

$len = count($array);
foreach ($array as $index => $item) {
    if ($index == 0) {
        // обработка первого элемента
    } else if ($index == $len - 1) {
        // обработка последнего элемента
    }
}

Версия 2 - поскольку я пришёл к ненависти использования else, если это не обязательно.

$len = count($array);
foreach ($array as $index => $item) {
    if ($index == 0) {
        // обработка первого элемента
        // выполнять действие
        continue;
    }

    if ($index == $len - 1) {
        // обработка последнего элемента
        // выполнять действие
        continue;
    }
}

Такой стиль кода помогает избежать вложенности и делает его более читаемым. Использование continue позволяет переходить к следующей итерации, если текущий элемент - первый или последний.

0

Чтобы найти первый элемент в цикле, можно использовать следующую конструкцию:

$first = true; 
foreach ( $obj as $value )
{
  if ( $first )
  {
    // Выполнить что-то для первого элемента
    $first = false; // Устанавливаем в false, чтобы не зашли в это условие на следующих итерациях
  }
  else
  {
    // Выполнить что-то другое для всех остальных элементов, кроме первого
  }
}

Таким образом, при первом проходе выполняется одна логика, а для всех последующих — другая.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь