P粉4634184832023-08-23 09:19:01
each()
#實際上有很多情況下可以替換each()
,這就是為什麼在這個問題中有這麼多不同的被贊同的答案。
-while (list($key, $callback) = each($callbacks)) { +foreach ($callbacks as $key => $callback) { // ... }
還有:
-while (list($key) = each($callbacks)) { +foreach (array_keys($callbacks) as $key) { // ... }
你可以手動一個一個地替換。但是沒有更好的方法嗎?
我幫忙遷移項目,有150多個這樣的情況。我很懶,所以我做了一個叫做Rector的工具,可以將程式碼轉換成上述的方式(還有更多情況,但我不想在答案中垃圾郵件) 。
它是PHP_72
集合的一部份。
composer require rector/rector --dev
rector.php
設定檔vendor/bin/rector init
PHP_72
集合<?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, ]); };
vendor/bin/rector process src --set php72
希望它對你的遷移有幫助。
如果有任何錯誤或異常,那是Rector錯過的情況。 建立一個問題,這樣我們就可以修復它,並使其適用於所有可能的情況。
P粉9828815832023-08-23 00:06:26
對於你的前兩個範例案例,你可以使用 key()
和 current()
來指派你所需要的值。
$ar = $o->me; // 重置不是必需的,因为你刚刚创建了数组 $typ = key($ar); $val = current($ar);
$out = array('me' => array(), 'mytype' => 2, '_php_class' => null); $expected = [key($out), current($out)];
在這些情況下,你可以使用 next()
在之後推進遊標,但如果你的其餘程式碼不依賴它,這可能是不必要的。
對於第三種情況,我建議你只是使用一個 foreach()
循環,並在循環內部分配 $kv
。
foreach ($broken as $k => $v) { $kv = [$k, $v]; }
對於第四種情況,在 list()
中似乎忽略了鍵,所以你可以指派目前值。
$this->result = current($this->cache_data);
就像前兩種情況一樣,根據你的其餘程式碼如何與 $this->cache_data
交互,可能需要使用 next()
推進遊標。
第五種情況可以用 for()
迴圈來取代。
reset($array); for ($i = 0; $i < 30; $i++) { $id = key($array); $item = current($array); // 代码 next($array); }