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


280

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

根据!==用户的建议使用,如果数组中的至少一个元素不同,我期望以下内容可以打印enter,但实际上没有。

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

    echo "enter";
}

17
您使用的是=太多了,应该!==还是!=
JEROEN

29
只是为了记录(因为我的编辑得到了改回“的用户”),它是“用户”:english.stackexchange.com/questions/105116/...
teynon

7
['a'] == [0]true。好吧,这只是PHP。
大卫·霍瓦特

2
@DávidHorváth真的很奇怪,总是使用===很好的做法
AFA Med

1
@DávidHorváth,宽松的比较不仅在PHP中是宽松的。如果您查看JS,您会感到惊讶。只是不要使用,直到您对事情有了更好的了解。
ryabenko-pro

Answers:


508
$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.

请参阅数组运算符

编辑

不等式运算符是!=,而非身份运算符是!==要匹配相等运算符==和身份运算符===


79
附带说明:这种方法也适用于多维数组(以前对我而言并不明显)。
trejder 2013年

5
PS:解决方案是使用array_values($a)==array_values($b)...另一个常见问题是关于唯一值,因此请记住存在array_unique()
彼得·克劳斯

13
这个答案是错误的。==仅适用于诸如的典型词典,而不论其顺序如何[1 => 'a', 2 => 'b']。例如[1 => 'a', 2 => 'b'] == [2 => 'b', 1 => 'a']。对于索引数组,像['a', 'b'] ==这样无法正常工作。例如['a', 'b'] != ['b', 'a']
nawfal

37
@nawfal:您的假设是错误的。['a', 'b']是一个数组[0 => 'a', 1 => 'b']['b', 'a']而是一个数组[0 => 'b', 1 => 'a']。这就是为什么他们没有我回答中所述的键/值对相同的原因==,因此在这些键/值对之间不起作用。
Stefan Gehrig 2015年

29
@StefanGehrig哦,您是对的。我将留下自己的评论,以使我明白自己的愚蠢:)
nawfal

88

根据此页面

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

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

<?php
    (array("x","y") == array("y","x")) === false;
?>

那是因为上面的意思是:

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

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


2
注意:在多维数组
maersu 2014年

8
上面的评论是错误的。如果$ b具有$ a的所有元素加上一些额外的元素,则两个数组不相等,但是上面的代码会说它们是。
Ghola 2014年

1
也许值得添加count($ a)== count($ b)
stefan

1
@super_ton:是的,在调用之前array_diff可以加快比较速度。我将其添加。谢谢
lepe 2016年

3
不幸的是,它在某些情况下不起作用,例如,我已经测试了以下情况$a = [1, 2, 2]; $b = [2, 1, 1];并返回true,但是两个数组显然并不相同。
AwesomeGuy

33

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

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";

7
如果键和值像使用比较一样来回移动,则会出现问题。但是,假设它们是100%相同,这是检查深度相等性的最干净,最简单的方法!
凯文·佩诺

1
我猜这是最好的解决方案!如果它们先前已排序,它可以比较多维数组和关联数组!
拉斐尔·莫尼

13

简短的解决方案即使在数组中键以不同顺序给出的情况下也可以使用:

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}

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


9

!===将无法使用,因为这是语法错误。正确的方法是!==(不是三个“等于”符号)


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

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

从我的观点来看,最好使用array_diff而不是array_intersect,因为通过这种性质的检查,通常返回的差异小于相似性,这样布尔转换就减少了内存消耗。

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


4

array_diff —计算数组的差

http://php.net/manual/zh/function.array-diff.php

array array_diff ( array $array1 , array $array2 [, array $... ] )

array1与一个或多个其他数组进行比较,并返回其他数组array1中不存在的值。


4
OP希望“检查两个数组是否相等”。array_diff无法告诉你。尝试array_diff([1, 2], [1, 2, 'hello'])
marcv

3

不管值顺序如何,都可以检查相等性的另一种方法是使用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';
}

这是一个使用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;
}

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

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

}

2
解释代码示例的工作很有帮助。这也适用于多维数组吗?
k0pernikus

1
和array_diff得到数组不同元件和array_diff如果返回空阵列中的两个阵列等于
DILOsürücü

2

一种方式:(为http://tools.ietf.org/html/rfc6902#section-4.6实现“被认为相等” )

这种方式允许其成员顺序不同的关联数组-例如,在除php之外的所有语言中,它们都被认为是相等的:)

// recursive ksort
function rksort($a) {
  if (!is_array($a)) {
    return $a;
  }
  foreach (array_keys($a) as $key) {
    $a[$key] = ksort($a[$key]);
  }
  // SORT_STRING seems required, as otherwise
  // numeric indices (e.g. "0") aren't sorted.
  ksort($a, SORT_STRING);
  return $a;
}


// Per http://tools.ietf.org/html/rfc6902#section-4.6
function considered_equal($a1, $a2) {
  return json_encode(rksort($a1)) === json_encode(rksort($a2));
}

1
我相信您应该是:$a[$key] = rksort($a[$key]);
pinkeen 2015年

2

数组上的语法问题

$array1 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$diff = array_diff($array1, $array2);

var_dump($diff); 

2

这是示例如何与数组比较并获得它们之间的不同之处。

$array1 = ['1' => 'XXX', 'second' => [
            'a' => ['test' => '2'],
            'b' => 'test'
        ], 'b' => ['no test']];

        $array2 = [
            '1' => 'XX',
            'second' => [
                'a' => ['test' => '5', 'z' => 5],
                'b' => 'test'
            ],
            'test'
        ];


        function compareArrayValues($arrayOne, $arrayTwo, &$diff = [], $reversed = false)
        {
            foreach ($arrayOne as $key => $val) {
                if (!isset($arrayTwo[$key])) {
                    $diff[$key] = 'MISSING IN ' . ($reversed ? 'FIRST' : 'SECOND');
                } else if (is_array($val) && (json_encode($arrayOne[$key]) !== json_encode($arrayTwo[$key]))) {
                    compareArrayValues($arrayOne[$key], $arrayTwo[$key], $diff[$key], $reversed);
                } else if ($arrayOne[$key] !== $arrayTwo[$key]) {
                    $diff[$key] = 'DIFFERENT';
                }
            }
        }

        $diff = [];
        $diffSecond = [];

        compareArrayValues($array1, $array2, $diff);
        compareArrayValues($array2, $array1, $diffSecond, true);

        print_r($diff);
        print_r($diffSecond);

        print_r(array_merge($diff, $diffSecond));

结果:

Array
(
    [0] => DIFFERENT
    [second] => Array
        (
            [a] => Array
                (
                    [test] => DIFFERENT
                    [z] => MISSING IN FIRST
                )

        )

    [b] => MISSING IN SECOND
    [1] => DIFFERENT
    [2] => MISSING IN FIRST
)

1

使用php函数array_diff(array1,array2);

它将返回数组之间的差异。如果为空,则它们相等。

例:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3'
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value4'
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print array = (0 => ['c'] => 'value4' ) 

范例2:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print empty; 

1
从技术上讲,它不会返回数组之间的差异。该文档指出“将array1与一个或多个其他数组进行比较,并返回array1中其他数组中不存在的值”。因此,如果array2中存在来自array1的所有值,即使array2具有更多的值,array_diff将返回一个空数组
2pha

不“打印null”,打印一个空数组(修复了大约十二个语法错误之后)。也许您可以(count(array_diff($a1, $a2)) + count(array_diff($a2, $a1))) === 0用来测试数组是否“相等”
user9645

我修复了语法(不是null为空,并且我在混合逗号-.-)。我想您提出的建议太多了。检查其空数组是否足够。
Wolfgang Leon

1

如果要检查非关联数组,请使用以下解决方案:

$a = ['blog', 'company'];
$b = ['company', 'blog'];

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.