PHP:array_push in循环结果只导致最后一条记录重复

时间:2014-03-18 00:20:35

标签: php

我认为我有一些基本的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" }
]

知道为什么这会给我带来荒谬的结果吗? 任何帮助,将不胜感激。 提前谢谢。

2 个答案:

答案 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));