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

时间:2011-04-15 15:25:03

标签: php arrays

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

根据用户的建议使用===,如果数组中至少有一个元素不同,我希望以下内容会打印输入,但事实上并非如此

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

    echo "enter";
}

16 个答案:

答案 0 :(得分:434)

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

请参阅Array Operators

修改

不等式运算符为!=,而非标识运算符为!==以匹配相等性 运算符==和标识运算符===

答案 1 :(得分:70)

根据this page

注意:接受的答案适用于关联数组,但对于索引数组,它将无法正常工作(如下所述)。如果要比较它们中的任何一个,请使用此解决方案。此外,此函数可能不适用于多维数组(由于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 :(得分:31)

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

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

答案 3 :(得分:9)

将它们作为其他值进行比较:

if($array_a == $array_b) {
  //they are the same
}

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

答案 4 :(得分:9)

!===无效,因为它是语法错误。正确的方法是!==(不是三个&#34;等于&#34;符号)

答案 5 :(得分:5)

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

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

答案 6 :(得分:2)

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

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

答案 8 :(得分:1)

array_diff - 计算数组的差异

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

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

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

答案 9 :(得分:1)

一种方式:(为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));
}

答案 10 :(得分:1)

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,因为经过这种性质的检查,通常返回的差异小于相似性,这样布尔转换就减少了内存消耗。

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

答案 11 :(得分:1)

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

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

}

答案 12 :(得分:0)

使用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; 

答案 13 :(得分:0)

数组上的语法问题

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

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

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

var_dump($diff); 

答案 14 :(得分:0)

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

/refresh

答案 15 :(得分:0)

以下解决方案适用于您可以作为回调传递的自定义相等函数。请注意,它不会检查数组顺序。

trait AssertTrait
{
    /**
     * Determine if two arrays have the same elements, possibly in different orders. Elements comparison function must be passed as argument.
     *
     * @param array<mixed> $expected
     * @param array<mixed> $actual
     *
     * @throws InvalidArgumentException
     */
    public static function assertArraysContainSameElements(array $expected, array $actual, callable $comparisonFunction): void
    {
        Assert::assertEquals(\count($expected), \count($actual));

        self::assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes($expected, $actual, $comparisonFunction);
        self::assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes($actual, $expected, $comparisonFunction);
    }

    /**
     * @param array<mixed> $needles
     * @param array<mixed> $haystack
     *
     * @throws InvalidArgumentException
     */
    private static function assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes(
        array $needles,
        array $haystack,
        callable $comparisonFunction
    ): void {
        Assert::assertLessThanOrEqual(\count($needles), \count($haystack));

        foreach ($needles as $expectedElement) {
            $matchesOfExpectedElementInExpected = \array_filter(
                $needles,
                static fn($element): bool => $comparisonFunction($expectedElement, $element),
            );

            $matchesOfExpectedElementInActual = \array_filter(
                $haystack,
                static fn($element): bool => $comparisonFunction($expectedElement, $element),
            );

            Assert::assertEquals(\count($matchesOfExpectedElementInExpected), \count($matchesOfExpectedElementInActual));
        }
    }
}

当我想确保返回预期元素但不关心排序时,我通常在数据库集成测试中使用它。