有人在php freach循环中见过这种情况吗?
我从一个有101个键的查询中构建了一个多维数组 当我在某个foreach循环之前回显$result['q101']时,它会显示正确的数据 在这个循环之后,数组以某种方式被修改为$result['q101']=>8 注意:这发生在最后一个键上,与数字无关有人在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] =>
> [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。&
是需要注意的标志。