PHP array_push() 正在覆盖现有的数组元素
PHP array_push() is overwriting existing array elements
我正在尝试将对象推入一个数组,以得到一个像这样的对象数组:
[
{"recipient_name":"John D", "phone_number":"123456"},
{"recipient_name":"Doe J", "phone_number":"654321"},
{"recipient_name":"Jon Do", "phone_number":"112233"},
]
所以我在一个更大的数组上循环以获取名称和 phone 数字并将它们作为一个对象推送到这样的数组中:
$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
}
我做错了什么导致了这个问题,我该如何解决?
可以直接在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
因为当你使用:
array_push($myObjArray->message_recipients, $myRecipientsObj);
您正在将对该对象的引用推送到数组中,然后当您在随后的循环中更改该对象时,您实际上更改了数组中每个元素的内容。要解决此问题,您需要将对象的副本推送到数组中:
array_push($myObjArray->message_recipients, clone $myRecipientsObj);
$myObjArray->message_recipients[] = \DeepCopy\deep_copy($myRecipientsObj);
我正在尝试将对象推入一个数组,以得到一个像这样的对象数组:
[
{"recipient_name":"John D", "phone_number":"123456"},
{"recipient_name":"Doe J", "phone_number":"654321"},
{"recipient_name":"Jon Do", "phone_number":"112233"},
]
所以我在一个更大的数组上循环以获取名称和 phone 数字并将它们作为一个对象推送到这样的数组中:
$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
}
我做错了什么导致了这个问题,我该如何解决?
可以直接在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
因为当你使用:
array_push($myObjArray->message_recipients, $myRecipientsObj);
您正在将对该对象的引用推送到数组中,然后当您在随后的循环中更改该对象时,您实际上更改了数组中每个元素的内容。要解决此问题,您需要将对象的副本推送到数组中:
array_push($myObjArray->message_recipients, clone $myRecipientsObj);
$myObjArray->message_recipients[] = \DeepCopy\deep_copy($myRecipientsObj);