while(list($key, $value) = each($array)) vs. foreach($array as $key => $value)?

2022-08-30 12:01:57

最近我遇到了这个奇怪的问题:

while(list($key, $value) = each($array))

没有列出所有数组值,将其替换为...

foreach($array as $key => $value)

...工作完美。

而且,我现在很好奇。这两者之间有什么区别?


答案 1

您以前是否遍历过阵列? 记住它在数组中的位置,所以如果你不记住它,你可能会错过项目。each()reset()

reset($array);
while(list($key, $value) = each($array))

值得一提的是,这种数组遍历方法很古老,并且已被更惯用的前言所取代。我不会使用它,除非你特别想利用它一次一个项目的性质。

数组每个数组 &$array )

从数组返回当前键和值对,并推进数组游标。

执行后,数组游标将保留在数组的下一个元素上,如果到达数组的末尾,则超过最后一个元素。如果要使用 再次遍历数组,则必须使用。each()reset()each

(来源:PHP手册)


答案 2

好吧,一个区别是它只适用于数组(好吧,只有正确工作)。 将处理实现可遍历接口的任何对象(当然包括内置数组类型)。each()foreach

在前方可能有一个微观优化。基本上,foreach 等同于以下内容:

$array->rewind();
while ($array->valid()) {
   $key = $array->key();
   $value = $array->current();
   // Do your code here
   $array->next();
}

而基本上执行以下操作:each

$return = $array->valid() ? array($array->key(), $array->current()) : false;
$array->next();
return $return;

因此,两者的三条线是相同的。它们都非常相似。可能有一些微优化,不需要担心界面...但这充其量只是次要的。但它也将通过执行布尔转换和检查php代码与编译的C来抵消...更不用说在你的代码中,你调用两种语言构造和一个函数,而用它是一个单一的语言构造......eachtraversableforeachwhile/eachforeach

更不用说恕我直言,这是更具可读性的...因此,更容易阅读,更灵活意味着 - 对我来说 - 是明显的赢家。(这并不是说它没有用途,但就我个人而言,我从来不需要它)......foreachforeacheach