2011-11-27 141 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?