在PHP中合并两个对象数组

3
如何合并array1和array2? array1
Array
(
    [0] => stdClass Object
    (
        [name] => bob
        [id] => 84569354306
        [contacts] => Array
        (
            [0] => none
        )
    )
    [1] => stdClass Object
    (
        [name] => jill
        [id] => 456745742
        [contacts] => Array
        (
            [0] => none
        )
    )
)

数组2

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循环中遇到了困难。


函数get_object_vars()在这里可能会有用。 - Scuzzy
2个回答

8
你可以将这两个对象转换为数组,然后再重新转换回对象。一般的语法如下:
$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;

考虑到给定的子数组(contacts),难道不应该使用 array_merge_recursive 吗? - jszobody
如果每个数组都有多个对象,您会改变自己的方法吗? - rrrfusco
我在问题中添加了另一个对象。我假设您需要在代码中添加一个循环。 - rrrfusco
这会有所帮助。我的循环将所有内容放入一个对象中。 - rrrfusco
你的类型转换示例/函数很有帮助,但结果与我之前的评论一样存在问题。目前为止,Omar更接近正确答案。 - rrrfusco

4
另一种做法:
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 );

我本来想给你的另一个函数点赞。但这个函数把所有东西都包装在一个额外的数组中。 - rrrfusco
@rrrfusco 我在移除递归时犯了一个错误。现在它应该返回一个单一的数组。 - DiverseAndRemote.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接