繁体   English   中英

PHP:循环中的array_push仅导致最后一条记录重复

[英]PHP: array_push in loop results only the last record repeat

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

知道为什么这给了我可笑的结果吗? 任何帮助,将不胜感激。 提前致谢。

您的代码现在正在做什么:

每次循环,它正在改变一个对象的属性,并追加对象的引用 (按值传递,但价值的参考。)到$data数组,所以你必须在4点$data阵列指向只有一个宾语。 每次循环时,您都要更改值,最后一次分配值是在最后一个值上。 这就是为什么您所有的值都相同的原因。

你想做什么:

每次迭代都使用数据创建一个新对象,并每次都指向新对象。

其他解决方案:

如果您只想要一个包含值的数组而不是对对象的引用(例如您的输出),则可以尝试以下操作:

$data = array();
for ($i = 0; $i < count($results); $i++) {
    $row = $results[$i];
    $data[$i]['objectId'] = $row['objectId'];
    $data[$i]['username'] = $row['username'];
}
var_dump(json_encode($data));

Akshay2598的答案可能会解决,但解释并不完全正确。 这与按值传递或按引用传递无关:没有传递任何变量。

您获得相同结果的原因确实与参考有关。 最初创建对象时, $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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM