2

以下显示数组中的值的代码在包装在 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

感谢您的任何见解。不要犹豫,询问更多信息。

4

3 回答 3

0

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

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

于 2012-04-04T16:45:51.317 回答
0

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

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

于 2012-04-04T13:29:19.770 回答
0

你的代码兄弟有问题。

我刚刚测试过这个

$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

您介意向我们展示更多您的代码吗?

于 2012-04-04T13:29:42.343 回答