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

Ann*_* K. 36 php arrays

[2,5,3]    

[5,2,3]
Run Code Online (Sandbox Code Playgroud)

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

use*_*933 66

sort($a);
sort($b);
if ($a==$b) {//equal}
Run Code Online (Sandbox Code Playgroud)

  • 我不接受这个答案.对于`['a']`和`[true]`返回true. (10认同)
  • @JayBienvenu 用 `===` 而不是 `==`、`['a']` 和 `[true]` 测试了这个案例返回 false。 (3认同)
  • 值得注意的是,测试 sort($a) == sort($b) 总是返回 true,我假设是因为 PHP 正在检查 sort() 的返回值可能是 1,而不是查看数组。 (2认同)
  • 这不是最好的答案,排序会影响数组值。它并不适用于所有情况 (2认同)

Twi*_*ght 16

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

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


Con*_*one 12

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

$same = ( count( $a ) == count( $b ) && !array_diff( $a, $b ) )
Run Code Online (Sandbox Code Playgroud)

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

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

  • 再深入一点,这似乎并不适用于所有情况,因为 array_diff 将多个结果合并为一个。这似乎过去了。$a = ['red','red','blue','blue']; $b = ['红色','红色','红色','蓝色']; (2认同)
  • 事实上@JayBienvenu,许多 PHP 函数对类型并不严格。添加这当然是一个有用的注释,因为偶尔可能会有一些重要的用例,但考虑到 PHP 默认情况下实际上是松散类型的,这就是野兽的本质。假装不这样是没有意义的。您不是在寻找不同的解决方案,而是在寻找不同的语言。 (2认同)
  • @JayBienvenu 简而言之,答案永远只有一个。编程始终是一种平衡行为,我认为您来到这里批评所有答案没有在默认情况下通常不提供精确类型匹配的语言中提供精确类型匹配是没有多大意义的。无论您是否意识到,您都在抱怨 PHP,而不是这里的任何答案,这对任何人都没有真正的帮助。如果精确的类型匹配是你认真对待的事情,那么你应该发布一个提供这种精确性的答案 - 事实上,其他人可能需要它,所以很高兴看到。 (2认同)

whi*_*row 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';
}
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案不考虑重复项目.例如:[2,5,3]和[5,2,3,3]根据上述逻辑相同. (5认同)

小智 6

最好的方法是使用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);
Run Code Online (Sandbox Code Playgroud)

  • @Chris 仍然会给你误报 [2,2,1] 和 [1,1,2] (3认同)
  • 该解决方案不考虑项目的重复。例如:根据上述逻辑,[2,5,3] & [5,2,3,3] 相等。https://3v4l.org/1SRp7 (2认同)

sey*_*hni 6

由于给出的答案都不是完全与键无关的重复值(如[1,1,2]equals [1,2,2]),因此我编写了自己的答案。

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

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

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


为什么不修改$either?因为 PHP 中的值是写时复制的,所以只要这是它自己的函数$either而不是内联代码,第一次修改参数时就会复制数组。

如果您想内联此代码,请先执行此操作:

$either = $myarray;
// inline code from function above
Run Code Online (Sandbox Code Playgroud)