检查两个数组是否具有相同的值

时间:2014-01-15 13:19:58

标签: php arrays

[2,5,3]    

[5,2,3]

它们是相同的,因为它们具有相同的值,但不是以相同的顺序。我可以在不使用带有in_array()的foreach循环的情况下找到答案吗?我认为这不会有效。

9 个答案:

答案 0 :(得分:64)

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

答案 1 :(得分:15)

派对有点晚了,但希望它有用:

如果您确定数组只包含字符串或两者都只包含整数,那么array_count_values($a) == array_count_values($b)具有更好的时间复杂度。但是,user1844933的答案更为通用。

答案 2 :(得分:11)

迟到这个派对。我有同样的问题,但不想排序,这是我知道可行的直接答案。我提出了这个简单的单行,它仅适用于唯一值数组

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

它比sort选项快5倍。这并不是特别慢,所以我想说的更多是关于你的个人偏好以及你认为哪一个更清楚。我个人不愿意排序。

编辑:感谢Ray指出这一事实,这只适用于具有唯一值的数组。

答案 3 :(得分: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 :(得分:1)

最好的方法是使用array_diff http://php.net/manual/en/function.array-diff.php

$arr1 = [2,5,3];
$arr2 = [5,2,3];

$isEqual = array_diff($arr1,$arr2) === array_diff($arr2,$arr1);

答案 5 :(得分:0)

由于给出的答案中没有一个完全是与键无关的重复值(例如[1,1,2]等于[1,2,2]),所以我自己写了。

此变体不适用于多维数组。它会检查两个数组是否包含完全相同的值,而不管它们的键和顺序如何,而无需修改任何参数。

function array_equals(array $either, array $other) : bool {
    $copy = $either;
    foreach ($other as $element) {
        $key = array_search($element, $copy, true);
        if ($key === false) {
            return false;
        }
        unset($copy[$key]);
    }
    return empty($copy);
}

尽管该问题询问的是无foreach变体,但没有循环,我找不到满足我要求的任何解决方案。另外,大多数其他使用的函数也在内部使用循环。

答案 6 :(得分:0)

说,如果您有两个这样定义的数组:

$array1 = array(2,5,3);
$array2 = array(5,2,3);

然后,您可以使用这段代码来判断它们是否相等:

if(array_diff($array1,$array2) === array_diff($array2,$array1) &&count($array1)==count($array2))
{
    echo 'Equal';
}
else
{
    echo 'Not equal';
}

答案 7 :(得分:-2)

我遇到了这个问题并解决了: 我需要确保两个对象具有相同的字段 所以

const expectedFields = ['auth', 'message'];
const receivedFields = Object.keys(data);
const everyItemexists = expectedFields.map(i => receivedFields.indexOf(i) > -1);
const condition = everyItemexists.reduce((accumulator, item) => item && accumulator, true);

基本上,在这里遍历其中一个数组(尽管我假设有相同的大小)。然后检查它是否存在于另一个数组中。然后我减少了结果。

答案 8 :(得分:-3)

$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.";
}