PHP foreach中的refence变量有问题



我有这样的数据:

$a = [
"attr1"=> null,
"list"=> [
[
"other_attr"=> 47,
"personal"=> [
[
"id"=> 3071,
"quantity"=> 4,
"price"=> 340000
]
]
],
[
"other_attr"=> 47,
"group"=> [
[
"id"=> 3086,
"quantity"=> 2,
"price"=> 350000
]
]
]
]];

功能如下:

foreach( $a['list'] as &$value ){
if (!empty($value["personal"])) {
foreach ($value["personal"] as &$item) {
$item['F'] = "TREDA";
}
foreach ($value["personal"] as $item) {
print("do some thing here with new attribute Fn");
}
$value["C"] = 32213;
}
if (!empty($value["group"])) {
foreach  ($value['group'] as $item) {
print("Do some thing heren");
}
$value["C"] = "AAAA";
}
}

$a在以下函数之后的预期结果:

{"attr1":null,"list":[{"other_attr":47,"personal":[{"id":3071,"quantity":4,"price":340000,"F":"TREDA"}],"C":32213},{"other_attr":47,"group":[{"id":3086,"quantity":2,"price":350000}],"C":"AAAA"}]}

但实际数据错误如下:

{"attr1":null,"list":[{"other_attr":47,"personal":[{"id":3086,"quantity":2,"price":350000}],"C":32213},{"other_attr":47,"group":[{"id":3086,"quantity":2,"price":350000}],"C":"AAAA"}]}

Id 3071已被Id 3086替换。

有人能解释我这里出了什么问题吗?

谢谢你的帮助!

p/S代码演示链接PHPOnline Sandbox

正如您所发现的,通过参考传球可能是一种危险的游戏。这可能并不明显,但您在这个循环中创建了对$item的引用:

foreach ($value["personal"] as &$item) {

然后继续引用$value["personal"]中的第一个条目,即使您不再处于该循环中。所以这意味着稍后在你的代码中,当你这样做时:

foreach ($value['group'] as $item) {

您引用的是同一个$item变量(这是对$value["personal"].内条目的引用

因此,personal内部的条目被group内部的条目所替换。

如果你真的不需要引用,那么最好(也更安全(使用数组索引来更改值,比如

foreach ($value["personal"] as $index => $item) {
$item['F'] = "TREDA";
$value['personal'][$index] = $item;
}

最新更新