爆炸会不会在foreach中执行多次?

时间:2011-11-20 11:56:15

标签: php

$array='hello hello2';
foreach(explode(' ',$array) as $v)
 echo $v;

爆炸会执行多少次?

使用另一个var更好:

   $exploded = explode(...);
   foreach($exploded as $v)
      ...

5 个答案:

答案 0 :(得分:8)

它只执行一次。 foreach将对explode(数组或假)的返回值的副本进行操作。

foreach是一种期望$array as $key => $value的语言结构。 $array可以是任何求值为数组的表达式,explode就是这样一个函数。表达式仅计算一次,然后foreach对表达式的结果进行操作。

例如,这与常规for循环不同。 for循环有三个表达式。对于循环的每次迭代,都会计算第二个和第三个表达式。

因此,对于for循环,可能在这两个语句之间存在差异(将优化和count的O(1) - 性能除外):

for($i = 0; $i < count($array); ++$i) { … }
// vs.
for($i = 0, $c = count($array); $i < $c; ++$i) { … }

答案 1 :(得分:1)

explode只会被调用一次,并将返回的数组提供给foreach进行迭代。

如果只使用foreach调用一次,您可能不想使用其他变量。

但是如果你的爆炸失败并且在任何情况下都返回false,foreach将产生一个警告,因此在另一个变量中可以让你更好地控制那些警告和错误处理。

答案 2 :(得分:1)

它只执行一次。 foreachDocs将根据explodeDocs的返回值进行操作。

由于包含explode的表达式将被评估一次(它不在循环内),explode将只运行一次。

但由于返回值可以是arrayFALSEforeach仅适用于ArrayObject的类型,因此它赢了如果你只想执行FALSE一次,那么在foreach执行需要变量的explode之前,必须首先检查结果:

$array='hello hello2';

if (FALSE === $exploded = explode(' ',$array))
{
    throw new RuntimeException('Explode failed.');
}

foreach ($exploded as $v)
{
   echo $v;
}

对于此示例,对于foreach部分,$exploded也仅评估一次。

请参阅:Traversable

答案 3 :(得分:0)

只有一次explode会被执行,请随意使用第一个。

答案 4 :(得分:-4)

第二个将使您的代码更具可读性,并使您能够输出结果数组内容以用于调试目的。