2012-04-04 68 views
2

下面的代码在数组中显示值时,在包装在foreach()中时会显示不同的结果,而不是在使用简单的for-loop时。 for循环呈现正确的数据,但foreach()似乎是每次迭代修改输入数组。PHP 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(见(看似随机的)值)是从其它元件阵列中的实际值

输入阵列($ ARR1(因为它看起来开始前在foreach阵列)和$ arr2)可以在这里找到:http://pastebin.com/wQN8XXu2

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

+0

有趣。每个循环迭代的'var_dump'的输出是什么? – knittl 2012-04-04 13:22:46

+0

你是说你用你的数据运行了上面的* exact *代码,并且你看到这个问题? – DaveRandom 2012-04-04 13:23:12

+0

我[无法重复](http://codepad.viper-7.com/eHzDf2)这... PHP版请 – DaveRandom 2012-04-04 13:28:59

回答

0

的foreach修改内部数组指针,对于没有,因为它期望你提供整数偏移,如在此所证明http://us3.php.net/manual/en/control-structures.foreach.php

“作为的foreach依赖于内部数组指针在循环内改变它可能导致到意想不到的行为。“

+1

“foreach修改内部数组指针”不,它没有。 'foreach'与数组的副本一起工作,这就是为什么您要使用引用(la'foreach($ arr as&$ val)')来修改源数组。无论如何,这将是无关紧要的,他正在静态地引用这些值。 – DaveRandom 2012-04-04 13:30:55

+1

是的,它的确如此。 http://us3.php.net/manual/en/control-structures.foreach.php – menacingly 2012-04-04 13:31:51

+1

是的,它的确如此:http://php.net/manual/pt_BR/control-structures.foreach.php。事情是,在循环开始时它只重置一次。在这种情况下,它没有任何区别。 – 2012-04-04 13:32:00

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 

你是否介意我们一点你的代码?

+0

谢谢 - 我将转储真实数组的全部内容并很快发布(示例数组不是真正的数组。) – 2012-04-04 13:37:43

0

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

我们注意到数组转储中的“&”在发布给你们之后,因此StackOverflow帮助我们调试过程......感谢大家的意见。