2014-06-05 96 views
0

我要做到以下幾點:PHP,in_array沒有完全匹配

$a = array(); 
$a[] = array(1,2); 
$a[] = array(2,5); 
$a[] = array(3,4); 
var_dump (in_array(array(2,5), $a)); 

這個返回OK,因爲它預期,但如果源陣列不是完全匹配:

$a = array(); 
$a[] = array(1,2, 'f' => array()); 
$a[] = array(2,5, 'f' => array()); 
$a[] = array(3,4, 'f' => array()); 
var_dump (in_array(array(2,5), $a)); 

它返回false。有沒有辦法用內置的方式來做到這一點,或者我必須編寫它?

+1

爲什麼不:的var_dump(in_array(2美元)&& in_array(5,$ A)) –

+0

這不會採取訂單考慮在內。對於2,5和5, –

+1

這是不會有效的。第一種方法檢查'$ a'中是否有'array'作爲元素,並且它是否具有值'2,5'。但是'2'和'5'不是'$ a',因爲'$ a'表示爲'$ a = array(1 => array(2,5,'f'))' –

回答

2

in_array()只是不是你應該用於這個問題的東西。因爲它會將值與類型轉換進行比較,如果需要的話。相反,你可以使用普通的循環或者類似的東西:

function in_array_array(array $what, array $where) 
{ 
    return count(array_filter($where, function($x) use ($what) 
    { 
     return $x===$what; 
    }))>0; 
} 

所以後來

var_dump(in_array_array(array(2, 5), $a)); //true 
1
$needle = array(2, 5); 
$found = array_reduce($a, function ($found, array $array) use ($needle) { 
    return $found || !array_diff($needle, $array); 
}); 

這確實的針是否是一個數組的一個子集的實際測試。

function subset_in_array(array $needle, array $haystack) { 
    return array_reduce($haystack, function ($found, array $array) use ($needle) { 
     return $found || !array_diff($needle, $array); 
    }); 
} 

if (subset_in_array(array(2, 5), $a)) ...