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

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

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

share

1 ответ

Разработчики описали изменения в 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) {
	var_dump($val);
	unset($array[1]);
}
//Результат:
string(5) "first"
string(6) "second"
string(5) "third"

В более ранних версиях 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"

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

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

Добавить комментарий
    как минимум 5 символов

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

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