我认为我有一些基本的PHP技能,至少足以为简单的应用程序进行开发,但我发现自己陷入了非常基本的数组操作问题。
我在$ results变量上设置了curl操作的结果。为了更简单的代码,(责怪我它太原始了。),我已经使用基本循环遍历$ results变量来为我的下一个操作产生有利的结果。
$data = array();
for ($i = 0; $i < count($results); $i++) {
$row = $results[$i];
$atom->objectId = $row['objectId'];
$atom->username = $row['username'];
array_push($data, $atom);
}
var_dump(json_encode($data));
示例数据:
{
[0] => { ["objectId"]: "12345", ["username"]: "user1" },
[1] => { ["objectId"]: "12567", ["username"]: "user2" },
[2] => { ["objectId"]: "12789", ["username"]: "user3" },
[3] => { ["objectId"]: "13579", ["username"]: "user4" }
}
您可以简单地找出预期的输出,但实际输出结果是:
[
{ "objectId": "13579", "username": "user4" },
{ "objectId": "13579", "username": "user4" },
{ "objectId": "13579", "username": "user4" },
{ "objectId": "13579", "username": "user4" }
]
知道为什么这会给我带来荒谬的结果吗? 任何帮助,将不胜感激。 提前谢谢。
答案 0 :(得分:5)
您的代码现在正在做什么:
每个循环,它正在更改一个对象的属性,并将对象的引用(按值传递,但值为引用。)附加到{{1} }数组,因此$data
数组中有4个点指向只有一个对象。每次循环时,都会更改该值,上次分配的值是最后一个值。这就是为什么你的所有价值都是一样的。
您想做什么:
每次迭代时使用数据创建一个新对象,并每次指向新对象。
其他解决方案:
如果你只想要一个包含值的数组而不是对象的引用(比如输出),你可以试试这个:
$data
答案 1 :(得分:1)
Akshay2598的答案可能会成功,但解释并不完全正确。这与pass-by-value或pass-by-reference无关:没有传递任何变量。
您获得相同结果的原因确实与参考相关。最初创建对象时,$atom
变量不会设置为对象本身,而是设置为该对象的引用,即内存地址。
您基本上正在做的是更改对象$atom
所指向的属性,然后将该对象的引用添加到您的数组中。
因为您从未将新对象分配给$atom
,所以它会一直指向同一个对象。因为它会一直指向同一个对象,所以您将继续向阵列添加对同一对象的更多引用。
要解决此问题,您只需执行以下操作:
$data = array();
for ($i = 0; $i < count($results); $i++) {
$atom = new Atom(); // Add this bit to assign a new object for $atom to point to
$row = $results[$i];
$atom->objectId = $row['objectId'];
$atom->username = $row['username'];
array_push($data, $atom);
}
var_dump(json_encode($data));