2009-09-10 75 views
15

是否有PHP的內置函數讓我檢查兩個數組是否包含相同的值(順序不重要?)。PHP:內置函數檢查兩個數組值是否相等(忽略順序)

例如,我想返回我真爲以下兩個輸入的功能:

array('4','5','2') 
array('2','4','5') 

編輯:我可以排序的兩個數組並加以比較,但作爲我這樣一個懶惰的傢伙,我仍然更喜歡一個可以提取和使用的單線程。

回答

29

array_diff看起來像一個選項:

function array_equal($a1, $a2) { 
    return !array_diff($a1, $a2) && !array_diff($a2, $a1); 
} 

或在你的代碼的oneliner:

if(!array_diff($a1, $a2) && !array_diff($a2, $a1)) doSomething(); 
+3

你只能在varliables中使用'empty'。 – Gumbo 2009-09-10 09:27:55

+0

gumbo:不,你可以在數組上使用它。取自:「以下事情被認爲是空的:#array()(一個空數組)」 – knittl 2009-09-10 09:40:01

+3

Gumbo是對的。你不能用'empty'來使用函數的返回值。這就是他實際上所說的。您必須將'array_diff'的返回值存儲在一個臨時變量中,或者只使用not操作符:'return!array_diff($ a1,$ a2)'。 – 2009-09-10 09:44:27

7

最好的解決辦法是理清兩個數組,然後對它們進行比較:

$a = array('4','5','2'); 
$b = array('2','4','5'); 
sort($a); 
sort($b); 
var_dump($a === $b); 

作爲一個功能:

function array_equal($a, $b, $strict=false) { 
    if (count($a) !== count($b)) { 
     return false; 
    } 
    sort($a); 
    sort($b); 
    return ($strict && $a === $b) || $a == $b; 
} 

這裏的另一種算法,在尋找的一個如果它在每一個元素B

function array_equal($a, $b, $strict=false) { 
    if (count($a) !== count($b)) { 
     return false; 
    } 
    foreach ($a as $val) { 
     $key = array_search($val, $b, $strict); 
     if ($key === false) { 
      return false; 
     } 
     unset($b[$key]); 
    } 
    return true; 
} 

但是這具有複雜度爲On^2)。所以你最好使用排序方法。

+0

因爲我是一個懶惰的傢伙,我仍然更喜歡一個我可以拔出和使用的單線。 – Graviton 2009-09-10 08:45:21

+2

@Ngu Soon Hui - 將Gumbo的代碼包裝成一個函數(array_equals($ arr1,$ arr2))? – karim79 2009-09-10 08:47:31

+2

如果評選者評論他爲什麼投下我的答案,這將會有所幫助。 – Gumbo 2009-09-10 10:10:45

2

你可以使用array_diff。

$a = array('4','5','2'); 
$b = array('2','4','5'); 

if(count(array_diff($a, $b)) == 0) { 
    // arrays contain the same elements 
} else { 
    // arrays contain different elements 
} 

但是,這種方法的一個問題是數組可以包含重複的元素,並且仍然匹配。

+1

任何人都知道差異之間的差異和排序在PHP中的細節? – Kazar 2009-09-10 08:51:11

+2

'if(array_diff($ a,$ b)){}'會做。空陣列評估爲false。 – SilentGhost 2009-09-10 09:32:11

+0

使用'array_diff'很容易。但是它需要額外的空間(O(* n *))作爲附加數組創建,其中* A *的元素被存儲,而不是* B *的元素。 – Gumbo 2009-09-10 09:36:44

3

array_diff()上述方法將無法正常工作。

php.net手冊說array_diff()執行此:

「返回包含所有從ARRAY1中不存在任何其它陣列的條目的陣列」。

所以實際array_diff()方法是:

function array_equal($array1, $array2) 
{ 
    $diff1 = array_diff($array1, $array2); 
    $diff2 = array_diff($array2, $array1); 

    return 
    (
     (count($diff1) === 0) && 
     (count($diff2) === 0) 
    ); 
} 

不過我去的一種排序方法:d

+0

+1這是一個更好的方法來做到這一點。我今天發現了這個問題,最後使用'!array_diff($ a,$ b)&&!array_diff($ b,$ a)'。不是最好的解決方案,但它確實有效。 – Weboide 2011-02-12 19:02:37

+0

附註:雖然這沒有OP的問題,但值得記住的是,使用'array_diff()'(和'array_intersect()')類似的方法將會在多維數組上失敗**(PHP注意: _Array to string conversion_),而使用'=='和'==='的簡單數組運算符可以在這樣的數組上運行而不會出現任何問題。 – trejder 2013-09-23 08:47:14

0

可以使用array_intersect(),而不是array_diff()

$a = array('4','5','2'); 
$b = array('2','4','5'); 
$ca = count($a); 
$cb = count($b); 
$array_equal = ($ca == $cb && $ca == count(array_intersect($a, $b))); 

明智的性能。解決方案,其中兩個因素是重要的:

  • 數組越匹配,越是array_intersect()快。
  • 數組越大(超過10個值),越快array_intersect()

根據這些因素,一種方法可能比另一種快兩到三倍。對於包含很少(或不包含)匹配組合的大數組,或者對於大量匹配的小數組,這兩種方法都是等價的。

但是,排序方法總是更快,除非少數或幾乎沒有匹配組合的情況下。在這種情況下,array_diff()方法快30%。

+0

格式注意事項:您使用寫得不好的HTML代替Markdown(固定),並且您似乎不喜歡每個部分(固定)開頭的大寫字母。所以一般來說,我應該減少你的懶惰! :]但另一方面,你提供了一個非常有趣的答案,所以這很好! :] – trejder 2013-09-23 07:40:49

1

您只需要比較單向使用array_diff()並使用count()作爲反轉關係。

if (count($a1) == count($a2) && !array_diff($a1, $a2)) { 
    // equal arrays 
} 
0

如果比較的數組只包含字符串和/或整數,array_count_values讓你的陣列快速(VS O(n log n)O(n)時間進行排序)通過驗證兩個數組包含相同的價值觀和每個比較值在兩個數組中都發生相同的次數。

if(array_count_values($a1) == array_count_values($a2)) { 
    //arrays are equal 
} 
相關問題