Как вы объединяете 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;