2011-01-07 29 views
6

比方說,我想這樣做:PHP問題:如何array_intersect_assoc()遞歸

 
$a = array_intersect_assoc(
array(
    'key1' => array(
    'key2' => 'value2' 
), 
    'key3' => 'value3', 
    'key4' => 'value4' 
), 

array(
    'key1' => array(
    'key2' => 'some value not in the first parameter' 
), 
    'key3' => 'another value' 
) 
); 

var_dump($a); 

打印的結果是:

 
array 
    'key1' => 
    array 
     'key2' => string 'value2' (length=6) 

很顯然,與「KEY2」在這兩個相關值數組不相同,但array_intersect_assoc()仍然將'key2' => 'value2'作爲相交值返回。

這是期望的行爲array_intersect_assoc()

謝謝!

+3

這是相當驚人的!特別是因爲`array('key2'=>'value2')== array('key2'=>'某些值不在第一個參數中)=== false`,而array('key2'=>'value2 ')== array('key2'=>'value2')=== true`。我想我在這裏爲很多人說話:呵呵。 – 2011-01-07 15:35:23

回答

6

是的,這是預期的行爲,因爲比較是使用字符串表示完成的,並且函數不會遞歸嵌套數組。從manual

密鑰=>值對被視爲相等僅當(字符串)$ elem1 ===(字符串)這兩個值$ elem2時。換句話說,執行嚴格的類型檢查,所以字符串表示必須相同。

如果你試圖用交叉的陣列'key1' => 'Array',你會得到相同的結果,因爲數組的字符串表示始終'Array'

One of the user-contributed notes,由nleippe,包含一個遞歸實現,它看起來很有希望(我修改了第三行做任何非數組值字符串比較):

function array_intersect_assoc_recursive(&$arr1, &$arr2) { 
    if (!is_array($arr1) || !is_array($arr2)) { 
//  return $arr1 == $arr2; // Original line 
     return (string) $arr1 == (string) $arr2; 
    } 
    $commonkeys = array_intersect(array_keys($arr1), array_keys($arr2)); 
    $ret = array(); 
    foreach ($commonkeys as $key) { 
     $ret[$key] =& array_intersect_assoc_recursive($arr1[$key], $arr2[$key]); 
    } 
    return $ret; 
} 
+0

謝謝!一切都有道理:) – garyc40 2011-01-08 04:35:41