Раздел вопрос-ответ Особенности foreach в php 7

С момента выхода php 7 развелось много шума по поводу цикла foreach в php 7.

Что же именно изменилось в foreach? Пострадала ли обратная совместимость?

share

2 ответа

Разработчики описали изменения в foreach в php 7 следующим образом:

1) Итерации внутри foreach не влияют на указатель массива. Напомню, что управление указателем осуществляется семейством функций current(), next(), reset() и т.д.

Рассмотрим на примере. Более ранние версии php:

$array = [0, 1, 2];
foreach ($array as &$val) {
	var_dump(current($array));
}
exit;
// Результат:
int(1)
int(2)
bool(false)

В php 7 указатель будет всегда указывать на первый элемент массива (вернёт значение первого элемента):

// php 7
$array = [0, 1, 2];
foreach ($array as &$val) {
	var_dump(current($array));
}
exit;
// Результат:
int(0)
int(0)
int(0)

$array = [2, 1];
foreach ($array as $val) {
	var_dump(current($array));
}
exit;
// Результат:
int(2)
int(2)
int(2)

Интересно, что в более ранних версиях php, если не использоваться ссылку на элемент в foreach, то функция current внутри foreach всегда возвращает второй элемента массива:

$array = [0, 1, 2];
foreach ($array as $val) {
    var_dump(current($array));
}
exit;
// Результат:
int(1)
int(1)
int(1)

2) При проходе массива php 7 по значению foreach ($array as $val), foreach работает с копией массива. Это означает, что изменения массива внутри итерации никак не может повлиять на другие итерации, т.к. мы работаем с копией массива. Рассмотрим на примере:

$array = array('first', 'second', 'third');
foreach ($array as $val) {
	unset($array[1]);
}
var_dump($array);

//Результат:
string(5) "first"
string(6) "second"
string(5) "third"

В более ранних версиях php (php version < 7) было так:

$array = array('first', 'second', 'third');
foreach ($array as $val) {
	unset($array[1]);
}
var_dump($array);

//Результат:
string(5) "first"
string(5) "third"

3) При проходе массива php 7 по ссылке foreach ($array as &$val), модификация массива влияет на итерации.

(будет дополнено)

Второй пункт исправлен. В php 7 foreach не модифицирует исходный массив. –  root 8 лет назад
Второй пункт описан неверно, придуман в голове и не проверен. Код смысла не имеет. –  anonymous 8 лет назад
второй пункт снизу я не понял. –  anonymous 8 лет назад
Добавить комментарий
    как минимум 5 символов

    не понял.
    В более ранних версиях php (php version < 7) было так:

    $array = array('first', 'second', 'third');
    foreach ($array as $val) {
        var_dump($val);
        unset($array[1]);
    }
    //Результат:
    string(5) "first"
    string(5) "third"


    Это в какой версии?
    php5.5 нормально вываливает,
     

    $array = array('first', 'second', 'third');
    foreach ($array as $val) {
        var_dump($val);
        unset($array[1]);
    }
    //Результат:
    string(5) "first"
    string(6) "second"
    string(5) "third"

     

    Да, я неправильно добавил пример кода. После прохода цикла меняется исходный массив. Посмотрите, пожалуйста, обновил пример 2 пункте 2. –  root 8 лет назад
    Добавить комментарий
      как минимум 5 символов

      icon Вход в систему

      зарегистрироваться
      НОВЫЕ ПОЛЬЗОВАТЕЛИ