相关疑难解决方法(0)

PHP'foreach'如何实际工作?

让我通过说我知道它是什么foreach,做什么以及如何使用它来加上前缀.这个问题涉及它如何在发动机罩下工作,我不希望任何答案都是"这就是你如何循环阵列foreach".


很长一段时间,我认为这foreach与数组本身一起工作.然后我发现许多引用它的数据副本的事实,我已经假设这是故事的结尾.但是我最近讨论了这个问题,经过一些实验后发现这实际上并非100%正确.

让我说明我的意思.对于以下测试用例,我们将使用以下数组:

$array = array(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

测试案例1:

foreach ($array as $item) {
  echo "$item\n";
  $array[] = $item;
}
print_r($array);

/* Output in loop:    1 2 3 4 5
   $array after loop: 1 2 3 4 5 1 2 3 4 5 */
Run Code Online (Sandbox Code Playgroud)

这清楚地表明我们不直接使用源数组 - 否则循环将永远持续,因为我们在循环期间不断地将项目推送到数组.但只是为了确保这种情况:

测试案例2:

foreach ($array as $key => $item) {
  $array[$key + 1] = $item + 2;
  echo "$item\n";
}

print_r($array);

/* Output …
Run Code Online (Sandbox Code Playgroud)

php iteration foreach loops php-internals

1926
推荐指数
7
解决办法
39万
查看次数

在PHP中迭代数组的最快方法

我正在攻读Zend PHP认证.

不确定这个问题的答案.

问题:使用PHP 5迭代和修改数组的每个元素的最佳方法是什么?

a)您无法在迭代期间修改数组

b) for($i = 0; $i < count($array); $i++) { /* ... */ }

C) foreach($array as $key => &$val) { /* ... */ }

d) foreach($array as $key => $val) { /* ... */ }

E) while(list($key, $val) = each($array)) { /* ... */ }


我的本能是(B),因为不需要创建临时变量,然后我意识到它不适用于关联数组.进一步搜索网络发现:将不变数组计数存储在单独的变量中可以提高性能.

$cnt = count($array);
for ($i = 0; $i < $cnt; $i++) { }
Run Code Online (Sandbox Code Playgroud)

php arrays iteration

23
推荐指数
2
解决办法
2万
查看次数

PHP foreach声明引用:重用迭代器时的意外行为

此代码产生意外的输出:

$array=str_split("abcde");
foreach($array as &$item)
    echo $item;

echo "\n";
foreach($array as $item)
    echo $item;
Run Code Online (Sandbox Code Playgroud)

输出:

abcde
abcdd
Run Code Online (Sandbox Code Playgroud)

如果&$item用于第二个循环一切正常.

我不明白这段代码会如何影响内容 $array.我可以认为隐含unset($header)会删除最后一行,但双dd来自哪里?

php arrays foreach pass-by-reference

9
推荐指数
1
解决办法
2287
查看次数