PHP foreach()正在修改数组

PHP foreach()正在修改数组,php,arrays,foreach,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[

下面显示数组中的值的代码在使用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'];
}
foreach()的输出显示数组中的第91个元素随着每次迭代而变化:

56256.00
45652.00
50726.00
317896.00
...
这怎么可能

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

一些进一步资料:

  • $arr是通过数组合并两个91元素数组来创建一个182元素数组而创建的
  • 我看到的行为只发生在第91个元素上——如果我回显$arr[89]['circread\u value']或$arr[91]['circread\u value'],我也会从foreach()中获得一致的值
  • 我在foreach()中看到的(看似随机)值实际上是数组中其他元素的值(在开始foreach之前的数组)
输入数组($arr1和$arr2)可在以下位置找到:


谢谢你的洞察力。请随时询问更多信息。

foreach修改内部数组指针,因为它希望您提供一个整数偏移量,如这里所示


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

foreach修改内部数组指针,因为它希望您提供一个整数偏移量,如这里所示


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

您的代码有问题

我刚才:


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

你的代码兄弟出了点问题

我刚才:


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

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


我们在这里为大家发布了数组转储后注意到了“&”,因此StackOverflow帮助了我们的调试过程。。。谢谢大家的意见。

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


我们在这里为大家发布了数组转储后注意到了“&”,因此StackOverflow帮助了我们的调试过程。。。谢谢大家的意见。

很有意思。对于每个循环迭代,
var\u dump
的输出是什么?你是说你已经用你的数据运行了上面的代码,你看到了这个问题吗?我是。。。PHP版本please@DaveRandom是的,我已经运行了这个精确的代码。看起来很奇怪吧?我会跳到“PHP必须有bug”,但红色标志警告我,这更有可能是我的错误@DaveRandom注意到还有更多的代码(用于设置数组等,它是大型站点的一部分)。数组内容并不像我在这里所展示的那样(因为有更多的子元素而不仅仅是‘BLAH’,显然有182个元素需要考虑。)我可以把这个发送给你吗?很有趣。对于每个循环迭代,
var\u dump
的输出是什么?你是说你已经用你的数据运行了上面的代码,你看到了这个问题吗?我是。。。PHP版本please@DaveRandom是的,我已经运行了这个精确的代码。看起来很奇怪吧?我会跳到“PHP必须有bug”,但红色标志警告我,这更有可能是我的错误@DaveRandom注意到还有更多的代码(用于设置数组等,它是大型站点的一部分)。数组内容不完全如我在这里所示(因为有更多的子元素而不仅仅是‘BLAH’,显然有182个元素需要考虑。)我可以把它发送给你吗?<代码> FooCH修改内部数组指针< /代码> -不,不。code>foreach使用数组的副本,这就是为什么您需要使用引用(la
foreach($arr as&$val)
)来修改源数组。无论如何,这与这里无关,他是静态地引用这些值。是的,它是:。问题是,它只在循环开始时重置一次。在这种情况下,这没有任何区别。@drgomesp我同意这种情况,只是“这种情况”看起来像是虚构的,我想我会找到真正代码中可能存在的任何实际错误的根源(这显然不是),答案有一个有效的参数,但对这种情况来说是不正确的。是的,但它在每次迭代中都会推进该指针,并且在foreach的末尾,指针位于末尾(如所示)。因此,如果在每次迭代时将一个新项目推送到数组上,该指针永远不会到达终点,因为即使您在最后一个元素上,在该迭代结束时也会有另一个元素。
foreach修改内部数组指针。
-不,它不会
foreach
使用数组的副本,这就是为什么您需要使用引用(la
foreach($arr as&$val)
)来修改源数组。无论如何,这与这里无关,他是静态地引用这些值。是的,它是:。问题是,它只在循环开始时重置一次。在这种情况下,这没有任何区别。@drgomesp我同意这种情况,只是“这种情况”在我看来像是虚构的
56256.00
45652.00
50726.00
317896.00
...
$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