Объединить 2 массива объектов в PHP

Как вы объединяете array1 и 2?

array1

Array ( [0] => stdClass Object ( [name] => bob [id] => 84569354306 [contacts] => Array ( [0] => none ) ) [1] => stdClass Object ( [name] => jill [id] => 456745742 [contacts] => Array ( [0] => none ) ) ) 

array2

 Array ( [0] => stdClass Object ( [name] => bob [id] => 84569354306 [pid] => 1 [lang] => eng; [location] => ) [1] => stdClass Object ( [name] => jill [id] => 456745742 [pid] => 2 [lang] => eng; [location] => ) ) 

Массив результатов:

 Array ( [0] => stdClass Object ( [name] => bob [id] => 84569354306 [pid] => 1 [lang] => eng; [location] => [contacts] => Array ( [0] => none ) ) [1] => stdClass Object ( [name] => jill [id] => 456745742 [pid] => 2 [lang] => eng; [location] => [contacts] => Array ( [0] => none ) ) ) 

Я попробовал array_merge() который, кажется, добавляет объекты рядом друг с другом в массиве, а не объединяет объекты.

Я почти уверен, что этот вопрос похож на то, что мне нужно, но у меня возникают трудности с простым циклом foreach.

Другой способ сделать это:

 function merge_values(){ $list = func_get_args(); while( count( $list ) > 1 ){ $array1 = array_shift( $list ); $array2 = array_shift( $list ); $merged_array = $array1; foreach( $array2 as $key => $value ){ $merged_array[$key] = array_merge( (array)$value, (array)$merged_array[$key] ); if( is_object( $value ) || is_object( $array1[$key] ) ){ $merged_array[$key] = (object)$merged_array[$key]; } } array_unshift( $list, $merged_array ); } return current( $list ); } $merged = merge_values( $array1, $array2 ); 

Вы можете отнести два объекта к массиву, а затем повторно отбросить назад к объекту. Общий синтаксис:

 $merged = (object)array_merge_recursive((array)$firstObj, (array)$secondObj); ^ | note the recursive in your case 

Кроме того, если вы используете такие объекты, возможно, вам следует просто придерживаться массива. У него очень мало смысла делать что-то подобное с объектами

С несколькими элементами

Если у вас есть несколько элементов, вам просто нужно завершить мой скрипт внутри цикла:

 function myCustomMerge($array1, $array2) { assert('count($array1) == count($array2)'); $result = array(); foreach($array1 as $k=>$v) { $item = array_merge_recursive((array)$array1[$k], (array)$array2[$k]); $result[]=$item; // use (object)$item if you need objects } return $result; } 

Решение без литья

Если вы не хотите бросать назад и вперед между массивом и объектом, вы можете использовать get_object_vars() :

 $obj2props = get_object_vars($obj2); foreach ($obj2props as $prop => $value) { $obj1->$prop = $value; } return $obj;