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

PHP:内置函数,用于检查两个数组值是否相等(忽略顺序),php,arrays,Php,Arrays,PHP是否有一个内置函数可以让我检查两个数组是否包含相同的值(顺序不重要?) 例如,我需要一个函数,该函数为以下两个输入返回true: array('4','5','2') array('2','4','5') 编辑:我本可以对两个数组进行排序并进行比较,但由于我是一个懒惰的人,我仍然希望使用一个可以拉出并使用的行程序。最好的解决方案是对两个数组进行排序,然后进行比较: $a = array('4','5','2'); $b = array('2','4','5'); sort($a); s

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

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

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

编辑:我本可以对两个数组进行排序并进行比较,但由于我是一个懒惰的人,我仍然希望使用一个可以拉出并使用的行程序。

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

$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;
}
下面是另一个算法,用于查找A的每个元素(如果它位于B中):


但它的复杂性是O(n^2)。因此,您最好使用排序方法。

您可以使用array\u 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
}
但是,这种方法的一个问题是数组可以包含重复的元素,并且仍然匹配。

看起来像是一个选项:

function array_equal($a1, $a2) {
  return !array_diff($a1, $a2) && !array_diff($a2, $a1);
}
或者作为代码中的单行代码:

if(!array_diff($a1, $a2) && !array_diff($a2, $a1)) doSomething();
上面的
array\u diff()
方法无法工作

php.net的手册中说,
array\u 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

您可以使用
array\u intersect()
而不是
array\u diff()

性能方面。解决方案,其中两个因素很重要:

  • 数组匹配的频率越高,
    array\u intersect()
    越快
  • 数组越大(超过10个值),越快
根据这些因素,一种方法可能比另一种方法快两到三倍。对于匹配组合很少(或没有)的大数组,或者匹配组合很多的小数组,这两种方法是等效的


但是,排序方法总是更快,除非是使用很少或没有匹配组合的小数组。在这种情况下,
array_diff()
方法的速度要快30%。

您只需要比较单向使用和使用
count()
来处理反向关系

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

如果要比较的数组仅由字符串和/或整数组成,则通过验证两个数组包含相同的值以及每个值在两个数组中出现的次数相同,可以快速比较数组(在
O(n)
time与
O(n log n)
中进行排序)

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

作为@knittl接受回复的补充

为解决此问题,当其中一个阵列具有其他成员时:

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

    return false;
}
或者一行,按要求(但不好)



因为我是一个懒惰的人,我还是喜欢一行,我可以抽出并使用。@Ngu Soon Hui-所以把Gumbo的代码包装成一个函数(array_equals($arr1,$arr2))?如果被否决的选民评论他为什么投票否决我的答案,那会很有帮助。@Gumbo可能,因为他或她是一个生病的混蛋(对不起!:~),这就是为什么他或她否决了一个完全有效且专业的书面回答?:]有人知道php中diff和sort之间性能差异的细节吗?
if(array_diff($a,$b)){}
。空数组求值为false。使用
数组_diff
很容易。但它需要额外的空间(O(n)),因为在存储A元素的位置创建了一个额外的数组,而A元素不也是B元素。@Gumbo:有理由在意吗?@silenghost:如果你有无限的时间和空间,就不会。但是谁有呢?你只能对varliables使用
empty
。秋波:不,你可以在数组上使用它。摘自:“以下内容被认为是空的:#array()(空数组)“Gumbo是对的。不能将函数的返回值与
空一起使用。他实际上就是这么说的。您必须将
array_diff
的返回值存储在临时变量中,或者只使用not运算符:
return!数组_diff($a1,$a2)
@knittl:不,只能测试变量,不能测试值
empty()
仅检查变量,因为任何其他操作都会导致分析错误。再次,请看ionut:好的,这更有意义。我刚试过,你们都是对的。我编辑了我的答案,使用布尔类型转换(否定)+1,这是一种更好的方法。我今天发现了这个问题,并最终使用了
!数组_diff($a,$b)&!数组差异($b,$a)
。这不是最好的解决方案,但它确实有效。旁注:虽然这不是OP的问题,但值得记住的是,在多维数组上使用
array_diff()
(以及类似的
array_intersect()
)将失败(PHP注意:数组到字符串的转换),使用
==
==
的简单数组运算符时,这些数组将不会出现任何问题。格式设置注意:您使用了写得不好的HTML而不是标记(已修复),并且您似乎不喜欢每节开头的大写字母(已修复)。所以总的来说,我应该对你的懒惰投反对票!:]但是,另一方面,您提供了一个特殊而有趣的答案,所以这很好!:]向下投票作为一种通用解决方案,因为只有在两个阵列都是唯一的情况下,这才有效。如果任一数组包含多个相同值的实例,则不会给出正确的结果。代码应该如何处理数组具有多个相同值实例的情况,例如
array(1,2,3)
vs
array(1,2,3,1)
?有些答案会返回true,有些则返回false。此外,由于通过count()短路,一些会返回不一致的结果,并且在第一个示例中会返回false,但如果将
数组(1,2,3,1)
数组(1,2,3,2)
进行比较,则返回true。我的猜测是,这不适用于您的情况,但对于任何寻找可能存在重复条目的答案的人,必须注意使用满足您特定要求的算法。
if(array_count_values($a1) == array_count_values($a2)) {
    //arrays are equal
}
function areEqualIfOrderIgnored(array $a1, array $a2): bool
{
    if (
        ! array_diff($a1, $a2)
        && ! array_diff($a2, $a1)
        && count($a1) === count($a2)
    ) {
        return true;
    }

    return false;
}
if (! array_diff($a1, $a2) && ! array_diff($a2, $a1) && count($a1) === count($a2)) {do smth}