有人在php freach循环中见过这种情况吗?

有人在php freach循环中见过这种情况吗?,php,multidimensional-array,foreach,Php,Multidimensional Array,Foreach,我从一个有101个键的查询中构建了一个多维数组 当我在某个foreach循环之前回显$result['q101']时,它会显示正确的数据 在这个循环之后,数组以某种方式被修改为$result['q101']=>8 注意:这发生在最后一个键上,与数字无关 > [q99] => Array > ( > [name] => Disentanglement from Love Relationship > [abbr] =>

我从一个有101个键的查询中构建了一个多维数组

当我在某个foreach循环之前回显$result['q101']时,它会显示正确的数据

在这个循环之后,数组以某种方式被修改为$result['q101']=>8

注意:这发生在最后一个键上,与数字无关

> [q99] => Array
>     (
>         [name] => Disentanglement from Love Relationship
>         [abbr] => DfLR
>         [type] => Ascending
>         [response] => Sometimes
>         [score] => 3
>     )
> 
> [q100] => Array
>     (
>         [name] => Feelings of Self Worth
>         [abbr] => FoSW
>         [type] => Ascending
>         [response] => Almost Always
>         [score] => 1
>     )
> 
> [q101] => 8 /// WTF is this..??
下面是罪魁祸首。。如果我去掉这个,一切都会很好

foreach ($result as $key => $val){
    $response_table .= '<tr><td>'.str_replace('q', '', $key).'</td><td>'.$val['response'].'</td><td>'.$val['abbr'].'</td><td>'.$val['type'].'</td><td>'.$val['score'].'</td></tr>';
    $min[$val['abbr']] += 1;
    $max[$val['abbr']] += 1;    
}
foreach($result as$key=>$val){
$response_table.=''.str_replace('q',''.$key.'.'.$val['response'].'.$val['abbr'.'.'.'.$val['type'.'.'.$val['score'.];
$min[$val['abbr']]+=1;
$max[$val['abbr']]+=1;
}

确保您在foreach之后未设置$key、$val。 从…起
即使在foreach循环之后,$值和最后一个数组元素的引用仍然保留。建议通过unset()销毁它。

它是如何通过引用分配的?只有对象由referenceNote分配,这仅在您使用by reference语法(
foreach($result as$key=>&$val)
-注意
&
)时才相关。问题中显示的代码没有使用此选项,但前面的循环可能已经使用了此选项。您将其锁定。。前一个循环使用了&$val,我不知道它仍然保持不变。。。非常感谢。这是一个很小的问题。…@Barbara回答得很好,继续这样做,你很快就会得到很多答复:)@DevZer0这是一个错误的陈述,有两个原因:首先,PHP中的变量是通过引用显式地使用
=&
赋值的,但在其他情况下也一样。第二,这会导致将一个值赋给任一变量会影响这两个变量-它实际上是一个具有多个名称的变量;这与指向同一对象的两个变量不同——操纵对象似乎会影响两个变量,但如果为其中一个变量指定新值,则另一个变量不会受到影响。(当然,除非它是通过引用指定的。)你能给我们看一下完整的代码吗?是否有任何foreach循环通过引用使用
$val
?像这样:
$key=>&$val
。。。我不知道这会给系统的其余部分带来麻烦。现在我回到手册,看到了红色的大警告,我打了自己一巴掌……我通常在任何
foreach
循环上方添加一条注释,使用by-reference语法说“WARNING:foreach by reference!”,并在结束
}
后立即添加
unset()
,并附上适当的注释,说明它正在破坏参考。引用应该谨慎使用-它们有各种各样的尴尬含义,包括对性能的负面影响(内部使用称为“写入时复制”的技巧优化赋值)。@IMSoP-因此,如果循环为标准$key=>$val,则未设置的值不必正确?@smithy correct。
&
是需要注意的标志。