PHP array_push () перезаписывает существующие элементы массива - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь поместить объекты в массив, чтобы получить массив объектов следующим образом:

[
    {"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->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
}

Что я делаю не так, чтобы вызвать это, и как я могу обойти это?

Ответы [ 2 ]

4 голосов
/ 17 мая 2019

Это потому, что когда вы используете:

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

вы помещаете ссылку на объект в массив, и когда вы затем изменяете объект в последующих проходах по циклу, вы фактически изменяете содержимое каждого элемента массива. Чтобы обойти это, вам нужно вместо этого поместить копию объекта в массив:

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

Демонстрация на 3v4l.org

1 голос
/ 17 мая 2019

Вы можете непосредственно написать [] перед сообщениями-получателями, как показано ниже,

$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;
}

Это должно работать.

Работает Демо

...