2011-11-27 73 views
2

$arr1是anonymus对象的关联数组:PHP数组对象(stdClass)融合/相交?

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' 

问题是:这甚至可能?

回答

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

+0

辉煌。非常感谢你,回答接受! – gremo

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不同,对于stdClass类型的对象,PHP中没有类似的函数。你可以对象的两个数组转换为数组的数组,然后使用该函数但是:

# 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;}); 

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

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