PHP foreach()正在修改数组

时间:2012-04-04 13:19:50

标签: php arrays foreach

以下代码显示数组中的值,当包含在foreach()中时,与使用简单的for循环时相反,会显示不同的结果。 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_merge创建两个91元素数组以创建182元素数组。
  • 我看到的行为只发生在第91个元素 - 如果我回应$ arr [89] ['circread_value']或$ arr [91] ['circread_value'],我从foreach()得到一致的值太
  • 我在foreach()中看到的(看似随机的)值实际上是数组中其他元素的值(在开始foreach之前看起来是数组)

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

感谢您的任何见解。不要犹豫,要求提供进一步的信息。

3 个答案:

答案 0 :(得分:0)

foreach修改了内部数组指针,但是没有,因为它希望你提供一个整数偏移量,如http://us3.php.net/manual/en/control-structures.foreach.php

所示。

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

答案 1 :(得分:0)

你的代码兄弟有问题。

我刚刚tested this

$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

你介意向我们展示一些你的代码吗?

答案 2 :(得分:0)

发现问题。数组的第91个元素实际上是数组的引用。 foreach然后使用相同的变量名称(引用相同的数组 - 在我在问题中给出的示例代码段中名为$ unused),因此两者都在查看相同的数组。

我们注意到了“&amp;”在你为这些人发布之后在数组转储中,所以StackOverflow帮助我们的调试过程...感谢每个人的输入。

相关问题