【问题标题】:PHP array_push() is overwriting existing array elementsPHP array_push() 正在覆盖现有的数组元素
【发布时间】:2019-10-04 19:53:16
【问题描述】:

我正在尝试将对象推入一个数组,最终得到一个像这样的对象数组:

[
    {"recipient_name":"John D", "phone_number":"123456"},
    {"recipient_name":"Doe J", "phone_number":"654321"},
    {"recipient_name":"Jon Do", "phone_number":"112233"},
]

所以我循环一个更大的数组来获取姓名和电话号码,并将它们作为一个对象推送到这样的数组中:

$myLargerArray = pg_fetch_all($messageQuery); // This is my larger array

$size = count($myLargerArray);
for( $j = 0; $j < $size; $j++ ) {
    $myRecipientsObj->recipient_name = $myLargerArray[$j]['recipient_name'];
    $myRecipientsObj->phone_number = $myLargerArray[$j]['phone_number'];

    var_dump($myRecipientsObj); // This outputs the correct data added from [$j]

    array_push($myObjArray->message_recipients, $myRecipientsObj);

    var_dump($myObjArray->message_recipients); // The output shows array elements are being overwritten at each loop iteration
}

这是最后一个var_dump($myObjArray-&gt;message_recipients) 的示例:

array(1) {
  [0]=>
  object(stdClass)#2 (2) {
    ["recipient_name"]=>
    string(12) "First Person"
    ["phone_number"]=>
    string(9) "112233445"
  }
}
array(2) {
  [0]=>
  object(stdClass)#2 (2) {
    ["recipient_name"]=>
    string(13) "Second Person"
    ["phone_number"]=>
    string(9) "123456789"
  }
  [1]=>
  object(stdClass)#2 (2) {
    ["recipient_name"]=>
    string(12) "Second Person"
    ["phone_number"]=>
    string(9) "123456789"
  }
}
array(3) {
  [0]=>
  object(stdClass)#2 (2) {
    ["recipient_name"]=>
    string(16) "Third Person"
    ["phone_number"]=>
    string(9) "012345678"
  }
  [1]=>
  object(stdClass)#2 (2) {
    ["recipient_name"]=>
    string(16) "Third Person"
    ["phone_number"]=>
    string(9) "012345678"
  }
  [2]=>
  object(stdClass)#2 (2) {
    ["recipient_name"]=>
    string(16) "Third Person"
    ["phone_number"]=>
    string(9) "012345678"
  }
}
array(4) {
  ... // it just overwriting the data with duplicates
}

我做错了什么导致这个问题,我该如何解决?

【问题讨论】:

    标签: php arrays loops multidimensional-array array-push


    【解决方案1】:

    这是因为当你使用:

    array_push($myObjArray->message_recipients, $myRecipientsObj);
    

    您正在将对该对象的引用推送到数组中,然后当您在后续循环中更改对象时,您实际上更改了数组中每个元素的内容。要解决此问题,您需要将对象的副本推送到数组中:

    array_push($myObjArray->message_recipients, clone $myRecipientsObj);
    

    Demo on 3v4l.org

    【讨论】:

    • 哇,这个成功了。我从来没有想过克隆,主要是因为我认为推入数组就像它的 JS 对应物一样工作
    【解决方案2】:

    你可以在message_recipients前面直接写[]如下,

    $myObjArray->message_recipients = [];
    for ($j = 0; $j < $size; $j++) {
        $myRecipientsObj                 = new stdClass; // created std class object
        $myRecipientsObj->recipient_name = $myLargerArray[$j]['recipient_name'];
        $myRecipientsObj->phone_number   = $myLargerArray[$j]['phone_number'];
        $myObjArray->message_recipients[] = $myRecipientsObj;
    }
    

    它应该可以工作。

    工作demo

    【讨论】:

    • 让我试试。虽然值得一提的是我已经将它初始化为一个数组$myObjArray-&gt;message_recipients = Array();
    【解决方案3】:
    $myObjArray->message_recipients[] = \DeepCopy\deep_copy($myRecipientsObj);
    

    【讨论】:

    • 能否请您添加一些描述
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多