PHP:内置函数,用于检查两个Array值是否相等(忽略顺序)

时间:2009-09-10 08:42:03

标签: php arrays

我是否有PHP的内置函数来检查两个数组是否包含相同的值(顺序不重要?)。

例如,我想要一个函数,它为以下两个输入返回true:

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

编辑:我可以对两个阵列进行排序并对它们进行比较,但由于我是一个懒惰的家伙,我仍然更喜欢我可以拔出并使用的单线程。

8 个答案:

答案 0 :(得分:30)

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();

答案 1 :(得分:8)

最好的解决方案是对两个数组进行排序,然后比较它们:

$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 中,那么另一个算法会查找 A 的每个元素:

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;
}

但是它的复杂性为 O n ^ 2)。所以你最好使用排序方法。

答案 2 :(得分: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

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

但是,这种方法的一个问题是数组可能包含重复的元素,并且仍然匹配。

答案 4 :(得分:1)

您只需要使用array_diff()进行单向比较,然后使用count()进行反转关系。

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

答案 5 :(得分: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%。

答案 6 :(得分:0)

如果要比较的数组仅由字符串和/或整数组成,array_count_values允许您通过验证两者来快速比较数组(在O(n)时间与O(n log n)之间进行排序)数组包含相同的值,并且每个值在两个数组中出现的次数相同。

if(array_count_values($a1) == array_count_values($a2)) {
    //arrays are equal
}

答案 7 :(得分:0)

作为@knittl 已接受回复的补充

为了涵盖这种情况,当其中一个数组有其他成员时:

nm1 <- setdiff(names(dt), "A")
setnames(dt[, lapply(.SD, sum), A], nm1, paste0('total', nm1))[]

或一行,根据要求(但不是很好)

function areEqualIfOrderIgnored(array $a1, array $a2): bool
{
    if (
        ! array_diff($a1, $a2)
        && ! array_diff($a2, $a1)
        && count($a1) === count($a2)
    ) {
        return true;
    }

    return false;
}