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); }