确定2个关联数组是否具有相同的内容

时间:2011-04-05 19:45:13

标签: php arrays comparison

我正在尝试使用比较2数组的PHP函数,如果它们相同则返回true。

示例:

assertArrayEquals(array('a'=>1, 'b'=>2), array('a'=>1, 'b'=>2)); // True
assertArrayEquals(array('a'=>1, 'b'=>2), array('b'=>2, 'a'=>1)); // True
assertArrayEquals(array('a'=>1, 'b'=>2), array(1, 2)); // false
assertArrayEquals(array(2, 1), array(1, 2)); // false

有什么想法吗?

编辑: 其他测试案例:

assertArrayEquals(array('a'=>1, 'b'=>2), array('a'=>1, 'b'=>2, 'c'=>3)); // false
assertArrayEquals(array('a'=>1, 'b'=>2, 'c'=>3), array('a'=>1, 'b'=>2)); // false
assertArrayEquals(array('a'=>0), array('a'=>'foo')); // false

6 个答案:

答案 0 :(得分:3)

使用array_diff_assoc

<?php

var_dump(assertArrayEquals(array('a'=>1, 'b'=>2), array('a'=>1, 'b'=>2))); // True
var_dump(assertArrayEquals(array('a'=>1, 'b'=>2), array('b'=>2, 'a'=>1))); // True
var_dump(assertArrayEquals(array('a'=>1, 'b'=>2), array(1, 2))); // false
var_dump(assertArrayEquals(array(2, 1), array(1, 2))); // false



function assertArrayEquals($a, $b){
  return count(array_diff_assoc($a,$b)) == 0 && count(array_diff_assoc($b,$a)) == 0;
}

http://codepad.org/YoZIGjBY

答案 1 :(得分:2)

结帐http://php.net/array_diffhttp://php.net/array_intersect

或者如果你想做的就是检查是否平等:

对两个数组进行排序并使用===进行检查(或= = =如果你是一个害怕的小猫)

答案 2 :(得分:1)

使用==

php Manual: Array Operators

  

$a == $b - Equality - 如果$ a和$ b具有相同的键/值对,则为TRUE。


示例4不会传递,因为键/值对不相同:

0 => 2, 1 => 1 vs 0 => 1, 1 => 2


编辑:

如果数组包含不同的变量类型,请使用

function assertArrayEquals($a, $b) {
  asort($a);
  asort($b);

  return $a === $b;
}

即使对于评论中的示例,这也会给出预期的结果:

echo (int)assertArrayEquals(array('a'=>1, 'b'=>2),  array('a'=>1, 'b'=>2));     // true
echo (int)assertArrayEquals(array('a'=>1, 'b'=>2),  array('b'=>2, 'a'=>1));     // true
echo (int)assertArrayEquals(array('a'=>1, 'b'=>2),  array(1, 2));               // false
echo (int)assertArrayEquals(array(2, 1),            array(1, 2));               // false
echo (int)assertArrayEquals(array('a'=>0,'b'=>1),   array('a'=>'cake','b'=>1)); // false
echo (int)assertArrayEquals(array('a'=>'0','b'=>1), array('a'=>'cake','b'=>1)); // false

答案 3 :(得分:1)

看起来您希望确保数组具有相同的键/值对(严格类型),但不一定按相同的顺序排列。因此,使订单保持一致并严格比较。

function assertArrayEquals($a, $b)
{
    ksort($a); ksort($b);
    return ($a === $b);
}

通过测试,

testAssertArrayEquals(array('a'=>1, 'b'=>2),         array('a'=>1, 'b'=>2),         true);
testAssertArrayEquals(array('a'=>1, 'b'=>2),         array('b'=>2, 'a'=>1),         true);
testAssertArrayEquals(array('a'=>1, 'b'=>2),         array(1, 2),                   false);
testAssertArrayEquals(array(2, 1),                   array(1, 2),                   false);
testAssertArrayEquals(array('a'=>1, 'b'=>2),         array('a'=>1, 'b'=>2, 'c'=>3), false);
testAssertArrayEquals(array('a'=>1, 'b'=>2, 'c'=>3), array('a'=>1, 'b'=>2),         false);
testAssertArrayEquals(array('a'=>0,'b'=>1),          array('a'=>'cake','b'=>1),     false); // Extra

function testAssertArrayEquals($a, $b, $expected)
{
    $result = assertArrayEquals($a, $b);
    echo "Got " . var_export($result,1) . " expected " . var_export($expected,1) . PHP_EOL;
}

// Got true expected true
// Got true expected true
// Got false expected false
// Got false expected false
// Got false expected false
// Got false expected false
// Got false expected false

我还建议选择一个更好的功能名称,从长远来看,你目前的选择不会给你任何好处!

答案 4 :(得分:0)

function assertArrayEquals($array1, $array2) {
  return !array_diff($array1, $array2) and !array_diff($array2, $array1);
}

基本上我们使用array_diff()检查两个给定数组之间的差异。如果没有,那么它们是平等的。

尽管形式很简洁,但您可以使用简单的==来比较两个数组。 这是一些经过测试的样本:

echo (array('a'=>1, 'b'=>2) == array('a'=>1, 'b'=>2)) ? 'true' : 'false'; // true
echo (array('a'=>1, 'b'=>2) == array('b'=>2, 'a'=>1)) ? 'true' : 'false'; // true
echo (array('a'=>1, 'b'=>2) == array(1, 2)) ? 'true' : 'false'; // false
echo (array(2, 1) == array(1, 2)) ? 'true' : 'false'; // false

此脚本输出:truetruefalsefalse;

答案 5 :(得分:0)

PHP有一个功能。

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

$ result将返回数组中不同的所有内容。如果它们是相同的,它将不会返回任何内容。