我有这样的数据:
$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;
}