PHP数组的对象(stdClass)融合/交叉?

时间:2011-11-27 03:25:46

标签: php arrays object

$arr1是匿名对象的关联数组:

array
  15898 => 
    object(stdClass)[8]
      public 'date' => int

$ arr2是另一个具有两个(或更多,它不固定)属性的关联数组:

array
  15898 => 
    object(stdClass)[10]
      public 'fruits'
      public 'drinks'

在处理对象时,我找不到任何交叉和内容融合的功能。基本上我想获得:

array
  15898 => 
    object(stdClass)[8]
      public 'date' => int
      public 'fruits'
      public 'drinks'

问题是:这甚至可能吗?

2 个答案:

答案 0 :(得分:1)

如果我理解正确: -

$key = 15898;
$a[$key] = (object) array('date'=>time());
$b[$key] = (object) array('date2'=>time());
$c[$key] = (object) array_merge(get_object_vars($a[$key]), 
                                get_object_vars($b[$key]));

var_dump($c);

以上是在get_object_vars上使用来提取属于对象$ a,$ b,
的所有属性 并将其合并到一个新数组,然后执行转换为对象

通过这种方式,您可以将对象$ a,$ b中的所有属性(公共)分配给$ c

答案 1 :(得分:0)

只需将$arr1中所有对象的所有属性设置为$arr2的副本,即合并数组arr_merged,然后:

$arr_merged = $arr2;
foreach ($arr1 as $key => $obj)
{
    foreach ($obj as $property => $value)
    {
        $arr_merged[$key]->$property = $value;
    }
}

适用于所有可见属性(通常这些属性对于您的问题中的对象是公开的)。根据哪些对象应取代什么,您可能希望将$arr1$arr2交换。在此示例中,$arr1中的对象属性将覆盖$arr2中的同名属性。

array_replace_recursive不同,PHP中对于stdClass类型的对象没有类似的函数。您可以将两个对象数组转换为数组数组,然后使用该函数:

# convert objects to arrays
foreach(array('arr1', 'arr2') as $var)
    $$var = array_map('get_object_vars', $$var);

$arr_merged = array_replace_recursive($arr1, $arr2);

# convert arrays to objects
array_walk($arr_merged, function(&$v) {$v = (object) $v;});

对于我来说这看起来并不是更有用,因为它不像foreach那样清晰。可能如果你经常需要这些功能,你可以考虑将它包装成一个名字很好的函数。

相关:What is the best method to merge two PHP objects?