PHP foreach()正在修改数组


PHP foreach() is amending the array

下面的代码显示数组中的值,与使用简单的for循环相比,当包装在foreach()中时会显示不同的结果。for循环显示了正确的数据,但foreach()似乎在每次迭代中都在修改输入数组。

$arr = array_merge($arr1, $arr2);
for ($x = 0; $x < count($arr); $x++) {
    echo $arr[90]['circread_value'];
}
foreach ($arr as $unused) {
    echo $arr[90]['circread_value'];
}

for循环的输出一次又一次地是相同的值(正如预期的那样):

1382429.00
1382429.00
1382429.00
1382429.00
...

foreach()的输出显示数组中的第91个元素随着每次迭代而变化:

56256.00
45652.00
50726.00
317896.00
...

这怎么可能?

注意:我知道上面的代码是人为设计的(很明显,在foreach()中,我实际上想做进一步的处理,并引用我正在迭代的数组中的每个元素,而不仅仅是第91个元素。)我只是简单地将代码缩减为一些简单的东西(作为调试的一部分,就像在这里发布一样!)

一些进一步的信息:

  • $arr是通过array_合并两个91元素的数组来创建一个182元素的数组而创建的
  • 我看到的行为只发生在第91个元素上——如果我回显$arr[89]['cirred_value']或$arr[91]['cirreD_value'],我也会从foreach()中获得一致的值
  • 我在foreach()中看到的(看似随机的)值实际上是数组中其他元素的值(数组在foreach开始之前的样子)

输入数组($arr1和$arr2)可以在这里找到:http://pastebin.com/wQN8XXu2

感谢您的真知灼见。请随时询问更多信息。

foreach修改内部数组指针,因为它希望您提供一个整数偏移量,如下所示http://us3.php.net/manual/en/control-structures.foreach.php

"由于foreach依赖于内部数组指针,在循环中更改它可能会导致意外行为。"

您的代码兄弟有问题。

我刚刚测试了这个:

$arr = array(
    0 => array('blah' => 123.42),
    1 => array('blah' => 5488.87),
    90 => array('blah' => 669874.923)
);
for ($x = 0; $x < count($arr); $x++) {
    echo $arr[90]['blah'] . PHP_EOL;
}
foreach ($arr as $unused) {
    echo $arr[90]['blah'] . PHP_EOL;
}

并且输出良好:

669874.923
669874.923
669874.923
669874.923
669874.923
669874.923

你介意再给我们看一点你的代码吗?

发现问题。数组的第91个元素实际上是对数组的引用。foreach使用了相同的变量名(引用了相同的数组,在我在问题中给出的示例片段中未使用过,名为$),所以两者都在查看相同的数组。

我们注意到数组转储中的"&"是在这里为你们发布的,所以StackOverflow帮助了我们的调试过程。。。感谢大家的投入。