【问题标题】:Determine whether 2 assoc arrays have the same content判断2个assoc数组是否内容相同
【发布时间】:2011-04-06 05:12:47
【问题描述】:

我正在尝试使用一个 PHP 函数来比较 2 个数组,如果它们相同则返回 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

【问题讨论】:

  • == 对你来说不够好吗?
  • 不,因为 == 只检查值(就像 array_diff 一样)案例 #3 会通过。
  • @FMaz008,案例#3 没有通过==。我测试过了。
  • 那么 4 会通过(因为 array_diff 函数不应该像 array_diff_assoc 那样检查键关联)
  • 在做出假设之前请查看手册 (Array Operators):“$a == $b - 相等 - 如果 $a 和 $b 具有相同的键/值,则为 TRUE对.”示例 4 不会通过,因为键/值对相同:0 => 2, 1 => 1 vs 0 => 1, 1 => 2 .

标签: php arrays comparison


【解决方案1】:

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

【讨论】:

  • 似乎是一个不错的功能,我会对其进行单元测试,我会回来的:)
  • 这个通过应该失败:array('a'=>1, 'b'=>2), array('a'=>1, 'b'=>2, 'c '=>3)
  • 非常对,让我重写一下。
  • 有了 Charliepiga 的想法,我想出了: return count(array_diff_assoc($a, $b)) == 0 && count(array_diff_assoc($b, $a)) == 0 ;,但也许可以做得更好。
【解决方案2】:

查看http://php.net/array_diffhttp://php.net/array_intersect

或者如果您只需要检查是否相等:

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

【讨论】:

  • === 不会断言第二种情况。 == 只关心值,array_diff/intersect 也是如此。
【解决方案3】:

使用==

php Manual: Array Operators:

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


示例 4 不会通过,因为键/值对不一样:

0 =&gt; 2, 1 =&gt; 10 =&gt; 1, 1 =&gt; 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

【讨论】:

  • array('a'=&gt;0,'b'=&gt;1) == array('a'=&gt;'cake','b'=&gt;1) 为 FMaz008 的需求提供了不正确的结果。
  • 对于那个测试用例,我希望是假的,不是真的...... :(
  • 是的,因为0=='cake'。另一方面,array('a'=&gt;'0','b'=&gt;1) == array('a'=&gt;'cake','b'=&gt;1) 将返回 false(注意零周围的引号)。但是您可以使用=== 进行排序和比较 - 请参阅我编辑的答案。
  • @salathe,取决于应用程序。我猜在大多数应用程序中,具有相同键的值可能具有相同的类型。如果没有,后面的解决方案更好......
【解决方案4】:

您似乎想确保数组具有相同的键/值对(严格类型),但不一定按相同的顺序。所以,让订单一致,严格比较。

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

我还建议选择一个更好的函数名称,从长远来看,您当前的选择不会对您有任何好处!

【讨论】:

    【解决方案5】:

    PHP 对此有一个功能。

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

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

    【讨论】:

    • 不关心密钥。
    【解决方案6】:
    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;

    【讨论】:

    • 无法断言 array('a'=>1, 'b'=>2), array('b'=>1, 'a'=>2) 为假。跨度>
    • 它应该是假的,因为键的值已经被交换了。
    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多