(PHP 4, PHP 5, PHP 7)
each — Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
Начиная с PHP 7.2.0 функция УСТАРЕЛА, а в PHP 8.0.0 функцию УДАЛИЛИ. Полагаться на функцию настоятельно не рекомендуют.
Функция возвращает текущую пару ключа и значения массива и продвигает внутренний указатель массива на одну позицию.
После выполнения функции each() указатель массива останется на следующем элементе или за последним элементом, если указатель достигнет конца массива. Для повторного обхода каждого элемента массива потребуется вызвать функцию reset() .
arrayВходной массив.
Функция возвращает текущую пару ключа и значения массива
array. Пара возвращается
в массиве из четырёх элементов с ключами 0,
1, key и value.
Элементы с ключами 0 и key содержат
имя ключа элемента массива, а ключи 1 и value
содержат данные.
Функция each() вернёт значение false ,
если внутренний указатель массива указывает за пределы массива.
Пример #1 Примеры получения текущей пары ключа и значения массива функцией each()
<?php
$foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each($foo);
print_r($bar);
?>Переменная $bar теперь содержит следующие пары ключей и значений:
Array ( [1] => bob [value] => bob [0] => 0 [key] => 0 )
<?php
$foo = array("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each($foo);
print_r($bar);
?>Переменная $bar теперь содержит следующие пары ключей и значений:
Array ( [1] => Bob [value] => Bob [0] => Robert [key] => Robert )
Функцию each() часто вызывают совместно с функцией list() для обхода массива, как в этом примере:
Пример #2 Пример обхода массива функцией each()
<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');
reset($fruit);
while (list($key, $val) = each($fruit)) {
echo "$key => $val\n";
}
?>Результат выполнения приведённого примера:
a => apple b => banana c => cranberry
Поскольку присваивание массива другой переменной сбрасывает указатель исходного массива, пример выше вызвал бы бесконечный цикл, если бы внутри цикла переменную $fruit присвоили другой переменной.
Функция each() также принимает объекты, но иногда возвращает неожиданные результаты. Поэтому перебирать свойства объекта функцией each() не рекомендуют.
foreach Following the obsolescence of the each() function, here is a way to correct your source codes:
If you use each() in a while loop like this:
while (list($Key,$Value)=@each($Array)){
....
}
you have to replace with
foreach ($Array as $Key => $Value){
....
}
In the same minds.
while (list(,$Value)=@each($Array)){
....
}
will become
foreach ($Array as $Value){
....
}each was deprecated because it exposed too much of the internal implementation details, blocking language development. ("We can't do X because it would break each().")
https://wiki.php.net/rfc/deprecations_php_7_2#each
If you want an array pointer, maintain it yourself. Probably a good idea anyway, because then it's visible in the code.Use foreach instead of while, list and each. Foreach is:
- easier to read
- faster
- not influenced by the array pointer, so it does not need reset().
It works like this:
<?php
$arr = array('foo', 'bar');
foreach ($arr as $value) {
echo "The value is $value.";
}
$arr = array('key' => 'value', 'foo' => 'bar');
foreach ($arr as $key => $value) {
echo "Key: $key, value: $value";
}
?>Hello, since each() and list() often "betray" very old applications, I simply recommend not to use them anymore.
If you want to assign variables based on an associative array,
Replace this:
while(list ($key, $value) = each ($my_array)) {
$$key = $value;
}
with this:
foreach ($my_array as $key => $value) {
$$key = $value;
}Rector has an automated fix ('ListEachRector') to migrate away from `each()`:
https://github.com/rectorphp/rector/blob/master/docs/AllRectorsOverview.md#listeachrector
If you look at the code example you'll see this is even quite simple to do by hand.