// iterating to the end of an array or a limit > the length of the array
$i = 0;
reset($array);
while( (list($id, $item) = each($array)) || $i < 30 ) {
// code
$i++;
}
Когда я выполняю код на PHP 7.2, я получаю следующую ошибку:
Устарело: функция each() устарела. Это сообщение будет скрыто при дальнейших вызовах
выполнимо с foreach() 10.02.2018
array_map() с замыканием тоже подойдет. cchoe1 10.02.2018
Это похоже на материал из библиотеки xmlrpc. Что-то мне тоже нужно исправлять, лол. IncredibleHat 04.03.2020
Да, он устарел без веской причины и просто заставил людей изменить свой код и ничего не получить взамен. Еще одно разочарование в мире PHP. wiki.php.net/rfc/deprecations_php_7_2 PHPst 03.06.2020
В этих случаях вы можете использовать next() для последующего перемещения курсора, но это может не понадобиться, если остальная часть вашего кода не зависит от этого.
Для третьего случая я бы предложил вместо этого просто использовать цикл foreach() и назначить $kv внутри цикла.
foreach ($broken as $k => $v) {
$kv = [$k, $v];
}
В четвертом случае похоже, что ключ в list() не учитывается, поэтому можно присвоить текущее значение.
$this->result = current($this->cache_data);
Как и в первых двух случаях, может потребоваться переместить курсор с помощью next() в зависимости от того, как остальная часть вашего кода взаимодействует с $this->cache_data.
Вы можете заменить один за другим вручную. Но разве нет лучшего способа?
Помогаю мигрировать проекты, где таких кейсов более 150+. Мне лень, поэтому я сделал инструмент под названием Rector, который преобразует код так, как выше (+ есть еще случаи, но не хочу спамить ответ).
Это часть набора PHP_72.
4 Steps to Upgrade your Code
1. Install it
composer require rector/rector --dev
2. Create rector.php config
vendor/bin/rector init
3. Add PHP_72 set
<?php
use Rector\Core\Configuration\Option;
use Rector\Set\ValueObject\SetList;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$parameters->set(Option::SETS, [
Setlist::PHP_72,
]);
};
4. Run it on your code
vendor/bin/rector process src --set php72
Я надеюсь, что это поможет вам с вашей миграцией.
Если есть какая-то ошибка или аномалия, это дело Ректора пропустил. Создайте задачу, чтобы мы могли исправить ее и заставить ее работать в каждом возможном случае.
Ответ 3 · рейтинг 38 · Petro Mäntylä
Я нашел способ исправить это и решил поделиться информацией. Вот также другие примеры того, как обновить циклы each() до foreach().
Случай 1: отсутствует $value
reset($array);
while (list($key, ) = each($array)) {
Обновить до:
foreach(array_keys($array) as $key) {
Случай 2: отсутствует $key
reset($array);
while (list(, $value) = each($array)) {
Обновить до:
foreach($array as $value) {
Случай 3: ничего не упустить
reset($array);
while (list($key, $value) = each($array)) {
Обновить до:
foreach($array as $key => $value) {
Ответ 4 · рейтинг 34 · Wee Zel
вы можете создать свою собственную функцию each(), используя key(), current() и следующий(). затем замените свои вызовы этой функцией, например:
Затем создайте файл и введите функцию с оболочкой function_exists.
<?php
/**
* Adds the depreciated each() function back into 7.2
*/
if (!function_exists('each')) {
function each($arr) {
$key = key($arr);
$result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
next($arr);
return $result;
}
}
По сути, это объявляет функцию до запуска вашего php-приложения. Когда ваше приложение попытается запустить каждую функцию, вместо этого оно будет использовать вашу версию.
Это абсолютно не способ, которым вы должны подходить к этой проблеме, особенно в рабочей среде! Однако вы разработчик с ограничениями по времени, и вы просто хотите попробовать произвольные фреймворки для своего следующего проекта, и они не были обновлены для работы на вашем локальном сервере разработки без отката вашей версии php.
Когда вы зафиксируете базу кода для своего проекта, пожалуйста, продолжайте и внесите изменения в принятый ответ, потому что они действительно работают.
Я использовал эмуляцию каждой функции Wee Zel
Ответ 8 · рейтинг 1 · Martin
Чтобы расширить Petro Mäntylä отличный правильный ответ для Case 3 сильный>:
Вот полный пример ситуации "Случай 3", потому что я нахожу полные примеры гораздо более информативными, чем фрагменты однострочного кода:
Это подлинный код из сторонней базы старого кода (TCPDF)