2013-10-05 158 views
1

我倾向于发现,当使用foreach结构而不使用引用时,数组中的某些元素缺失。PHP foreach没有引用缺失元素

$array = array(); 

/* ... */ 

$array[] = 1; 
$array[] = 2; 
$array[] = 3; 

/* ... */ 

print_r($array); /* print_r always shows all elements */ 

foreach ($array as $element) { /* missing elements */ } 
foreach ($array as &$element) { /* does a fine job */ } 

我在我的代码中有三个独立的事件。修复很简单(添加&),但它听起来像是PHP中或我的设置中的错误...

更多人遇到这种情况吗?问题是什么?

PHP 5.4.12


编辑

案例:

$a = array(); 
$a[] = 1; 
$a[] = 2; 
$a[] = 3; 

foreach ($a as &$e) 
{ 
    echo $e; 
} 

echo '<br>'; 

foreach ($a as $e) 
{ 
    echo $e; 
} 

输出:

123 
122 
+4

我不这么认为人...你是否期待元素从1开始而不是0? –

+0

向我们展示目前在foreach中执行的内容是什么? – bwoebi

+0

您能否创建一个显示问题的确切示例? –

回答

0

恰恰印证。

<?php 
    $x[]=1; 
    $x[]=2; 
    $x[]=3; 
    $x[]=4; 
    foreach($x as $y) { 
    var_dump($y); 
    } 
?> 

INT(1)INT(2)INT(3)INT(4)

+0

我想出了怪物何时被转载,请再试一次! –

+0

使用引用(&)将您的迭代器顶起来... –

0

看来,这个问题在PHP解决版本。 5.6.10。

我有8个元素的数组。这里是var_dump:

array(8){[0] => string(18)“需要lname。” [1] =>字符串(18)“fname是必需的。” [2] =>字符串(18)“需要电子邮件。” [3] =>字符串(22)“需要password1”。 [4] =>字符串(22)“需要密码2”。 [5] =>字符串(44)“名字只能是字母和数字。” [6] =>字符串(43)“姓氏只能是字母和数字。” [7] =>串(22) “无效电子邮件地址”}

我使用此代码打印出数组:

的foreach($ _SESSION [ '错误']为$错误){ 打印$错误。 “
\ n”; }

My MAMP localhost uses PHP ver。 5.6.10其结果是完美:为必填

需要

” L-NAME FNAME 电子邮件需要的是需要 密码1需要 密码2 名必须是字母和数字。 姓氏必须仅为字母和数字 无效的电子邮件地址“

我的远程服务器使用PHP ver。 5.3,在这种情况下,服务器仅打印第一个元素

“需要lname”。

当我改变代码为Taco建议(foreach($ _SESSION ['error']为& $ error))ver。 5.3。也给了好的(和预期的)结果。