PHP - 检查两个数组是否相等

mar*_*zzz 257 php arrays

我想检查两个数组是否相等.我的意思是:相同的大小,相同的索引,相同的值.我怎样才能做到这一点?

使用!==用户的建议,我希望如果数组中的至少一个元素不同,则以下将打印输入,但事实上它不是.

if (($_POST['atlOriginal'] !== $oldAtlPosition) 
    or ($_POST['atl'] !== $aext) 
    or ($_POST['sidesOriginal'] !== $oldSidePosition) 
    or ($_POST['sidesOriginal'] !== $sideext)) {

    echo "enter";
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*rig 471

$arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs.
$arraysAreEqual = ($a === $b); // TRUE if $a and $b have the same key/value pairs in the same order and of the same types.
Run Code Online (Sandbox Code Playgroud)

请参见数组运算符.

编辑

不等式运算符!=是非标识运算符!==用于匹配等于运算符==和标识运算符===.

  • 旁注:这种方法**也适用于多维数组(以前对我来说并不那么明显). (69认同)
  • @nawfal:你的假设是错误的.`['a','b']`是一个数组`[0 =>'a',1 =>'b']`,而`['b','a']`是一个数组`[0 =>'b',1 =>'a']`.这就是为什么他们没有我的答案中所述的相同的键/值对,这就是为什么`==`在这些之间不起作用的原因. (29认同)
  • @StefanGehrig哦,你是对的.我会留下我的评论,以使我的愚蠢显而易见:) (24认同)
  • 这个答案是对的.`==`无论顺序如何只适用于典型的词典,如`[1 =>'a',2 =>'b']`.例如`[1 =>'a',2 =>'b'] == [2 =>'b',1 =>'a']`.对于索引数组,如`['a','b']``==`不能正常工作.例如`['a','b']!= ['b','a']`. (11认同)
  • 它不起作用,因为正确的拼写是!==或!= (5认同)
  • PS:解决方案是使用`array_values($ a)== array_values($ b)`...另一个常见的问题是关于唯一值,所以请记住存在`array_unique()`. (4认同)
  • 说 == 检查匹配的键/值对有点误导。它似乎实际上检查了值 == 彼此。因此,您可能会惊讶地发现 array(0) == array('not Zero') 为真。 (2认同)

lep*_*epe 81

根据这个页面.

注意:接受的答案适用于关联数组,但它不能像索引数组那样工作(如下所述).如果要比较它们中的任何一个,请使用此解决方案.此外,此函数可能无法用于多维数组(由于array_diff函数的性质).

测试两个索引数组,哪些元素的顺序不同,使用$a == $b$a === $b失败,例如:

<?php
    (array("x","y") == array("y","x")) === false;
?>
Run Code Online (Sandbox Code Playgroud)

那是因为上述意思是:

array(0 => "x", 1 => "y")array(0 => "y", 1 => "x").

要解决该问题,请使用:

<?php
function array_equal($a, $b) {
    return (
         is_array($a) 
         && is_array($b) 
         && count($a) == count($b) 
         && array_diff($a, $b) === array_diff($b, $a)
    );
}
?>
Run Code Online (Sandbox Code Playgroud)

添加了比较数组大小(由super_ton建议),因为它可以提高速度.

  • 以上评论是错误的.如果$ b具有$ a的所有元素加上一些额外的元素,则两个数组不相等,但上面的代码会说它们是. (8认同)
  • 也可能值得添加 count($a) == count($b) (3认同)
  • 注意:对于[多维数组],无法正常工作(http://stackoverflow.com/questions/19830585/why-array-diff-gives-array-to-string-conversion-error) (2认同)
  • @super_ton:是的,在调用 `array_diff` 之前可以加速比较。我会添加它。谢谢 (2认同)
  • 不幸的是,它在某些情况下不起作用,例如,我已经用以下情况测试了$ a = [1、2、2];$ b = [2,1,1];`并返回`true`,但是两个数组显然不相同。 (2认同)

小智 32

尝试序列化.这也将检查嵌套的子数组.

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
Run Code Online (Sandbox Code Playgroud)

  • 如果键和值的移动就像使用比较一样有问题.但是,假设它们预计100%相同,这是检查深度平等的最简洁,最简单的方法! (7认同)
  • 我想这是最好的解决方案!它可以比较多维数组和关联数组(如果它们之前已排序)! (2认同)

Emi*_*röm 9

将它们与其他值进行比较:

if($array_a == $array_b) {
  //they are the same
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关所有数组运算符的信息:http: //php.net/manual/en/language.operators.array.php 例如,===还要检查数组中元素的类型和顺序是否相同.

  • 或者`===`取决于所需的行为. (4认同)

Sod*_*aab 9

!===将无法正常工作,因为它是语法错误.正确的方法是!==(不是三个"等于"符号)


Sam*_*ent 9

工作简短的解决方案,即使对于以不同顺序给出键的数组也是如此:

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止可能是最好的答案,如果键被移动或者是多维数组,则大多数答案都不匹配。 (2认同)

Mar*_*mos 7

if (array_diff($a,$b) == array_diff($b,$a)) {
  // Equals
}

if (array_diff($a,$b) != array_diff($b,$a)) {
  // Not Equals
}
Run Code Online (Sandbox Code Playgroud)

从我的观点来看,使用 array_diff 比使用 array_intersect 更好,因为通过这种性质的检查,返回的差异通常小于相似性,这样 bool 转换对内存的占用就更少。

编辑请注意,此解决方案适用于普通数组,并补充上面发布的仅对字典有效的 == 和 === 。


dıl*_*ücü 7

function compareIsEqualArray(array $array1,array $array):bool
{

   return (array_diff($array1,$array2)==[] && array_diff($array2,$array1)==[]);

}
Run Code Online (Sandbox Code Playgroud)

  • 解释代码示例的作用很有帮助。这也适用于多维数组吗? (2认同)
  • 如果 array_diff 返回空数组两个数组相等,则 array_diff 从数组中获取不同的元素 (2认同)

whi*_*row 5

无论值顺序如何检查相等性的另一种方法是使用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)

这是一个也可以使用http://php.net/manual/en/function.array-uintersect.php处理多维数组的版本:

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

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

function compare($v1, $v2) {
    if ($v1===$v2) {
        return 0;
    }
    if ($v1 > $v2) return 1;
    return -1;
}
Run Code Online (Sandbox Code Playgroud)