2014-01-15 226 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'来执行此操作... –

相关问题