如何解决PHP foreach 中的引用变量有问题
我有这样的数据:
$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 F\n");
}
$value["C"] = 32213;
}
if (!empty($value["group"])) {
foreach ($value['group'] as $item) {
print("Do some thing here\n");
}
$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,"personal":[{"id":3086,"C":"AAAA"}]}
Id 3071 已替换为 Id 3086。
任何人都可以向我解释这里有什么问题吗?
感谢您的帮助!
链接 PHPOnline Sandbox 中的 P/S 代码演示
解决方法
正如您所发现的,通过引用传递可能是一个危险的游戏。这可能不明显,但您在此循环中创建了对 $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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。