2014-01-15 146 views
25
[2,5,3]  

[5,2,3] 

它們是相等的,因爲它們的值相同,但順序不同。我可以發現,沒有使用in_array()的foreach循環?我不認爲這將是有效的。檢查兩個數組是否具有相同的值

+5

排序和檢查... – user1844933

+0

array_diff()是不完美的。排序和比較最好的。 –

+0

@SureshKamrushi爲什麼? – jeroen

回答

57
sort($a); 
sort($b); 
if ($a==$b) {//equal} 
+0

排序功能有排序數據的副作用,所以如果你想保留原來的訂單,你需要將它複製到$ a和$ b中,然後再使用它。 – Ray

-1
$array1 = array(2,5,3); 
$array2 = array(5,2,3); 
$result = array_diff($array1, $array2); 
if(empty($result)) 
{ 
    echo "Both arrays are equal."; 
} 
else 
{ 
    echo "Both arrays are different."; 
} 
+7

這是不正確的。 您的代碼示例將失敗 $ array1 = array(2,5,3,3); $ array2 = array(5,2,3); array_diff檢查哪些值在兩個數組中,它並不關心它們在那裏的頻率。 –

+0

@Matthias Huttar這是正確的..不幸的是,我不得不去努力發現.. – Ionut

+0

此外,'array_diff'「比較array1與一個或多個其他數組,並返回array1中不存在的任何其他陣列「。因此,例如,如果'$ array2'具有比'$ array1'更明顯的值,則此答案中的代碼會錯誤地將這些數組報告爲相等。這是@SureshKamrushi在這個問題的評論中提到的一點。 – faintsignal

14

這是一個有點遲到了,但希望這將是有用的:

如果你確信陣列都只有包含字符串或兩者僅包含整數,然後array_count_values($a) == array_count_values($b)有更好的時間複雜性但是,user1844933的答案更一般。

+1

如果整數碰撞(意味着第一個值爲-1,第二個值爲+1),則這將失敗,計算出的值將與這兩個數組相等,但它們是不同的數組。 – kindaian

6

如果你不想數組排序,而只是希望不管值爲了使用http://php.net/manual/en/function.array-intersect.php的檢查平等,像這樣:

$array1 = array(2,5,3); 
$array2 = array(5,2,3); 
if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) { 
    echo 'Equal'; 
} else { 
    echo 'Not equal'; 
} 
+4

此解決方案不考慮重複項目。例如:[2,5,3]和[5,2,3,3]根據上述邏輯將是相等的。 – Rao

+0

hello sir,if $ array1 = array(2,5,3,1,9,8); $ array2 = array(5,2,3);那麼它是如何使用的? –

5

蒞臨這個聚會遲到。我有同樣的問題,但不想排序,這是我知道會工作的直接答案。我想出了這個簡單的一行這僅適用於唯一值的數組:

$same = (count($a) == count($b) && !array_diff($a, $b)) 

這也是有關的比排序選項5快的一個因素。這不是說要麼特別慢,所以我會說它更多的是關於你的個人喜好,你認爲哪一個更清楚。我個人寧願不排序。

編輯:謝謝雷指出,這隻適用於具有唯一值的數組。

+0

我認爲這是最好的答案,接受的答案留下了實際排序數組$ a和$ b的副作用,而這些副作用可能不是你想要的。 – Ray

+0

稍微深入一點,這似乎不適用於任何情況,因爲array_diff會將多個結果合併爲一個結果。這似乎過去了。 $ a = ['紅','紅','藍','藍']; $ b = ['紅','紅','紅','藍']; – Ray

+0

這讓我很傷心......我必須檢查一下。我真的不想做任何排序,但我也不想在'$ a'和'$ b'上拋出一個'unique'來執行此操作... –

相關問題