С момента выхода php 7 развелось много шума по поводу цикла foreach в php 7.
Что же именно изменилось в foreach? Пострадала ли обратная совместимость?
|
С момента выхода php 7 развелось много шума по поводу цикла foreach в php 7. Что же именно изменилось в foreach? Пострадала ли обратная совместимость? |
||||
|
|
|
Разработчики описали изменения в 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 по значению
$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 по ссылке (будет дополнено) |
|||||||||
|
|
не понял.
$array = array('first', 'second', 'third');
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}
//Результат:
string(5) "first"
string(5) "third"
$array = array('first', 'second', 'third');
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}
//Результат:
string(5) "first"
string(6) "second"
string(5) "third"
|
|||||
|