判断2个assoc数组内容是否相同

发布于 2024-10-30 05:07:35 字数 702 浏览 0 评论 0原文

我正在尝试使用 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

I'm trying to have a PHP function that compare 2 array and return true if they are identical.

Example:

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

Any idea ?

Edit:
Other tests cases:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

机场等船 2024-11-06 05:07:35

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

Use 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

不交电费瞎发啥光 2024-11-06 05:07:35

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

或者,如果您要做的只是检查是否相等:

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

check out http://php.net/array_diff and http://php.net/array_intersect

Or if all you wnna do is check for equality:

sort both arrays and check with === (or == if you're a scaredy kitty)

番薯 2024-11-06 05:07:35

使用==

php 手册:数组运算符

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


示例 4 不会通过,因为键/值对不相同:

0 =>; 2、 1 => 10 => 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

Use ==.

php Manual: Array Operators:

$a == $b - Equality - TRUE if $a and $b have the same key/value pairs.


Example 4 won't pass as the key/value pairs are not the same:

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


EDIT:

If arrays contain different variable types, use

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

  return $a === $b;
}

This will give expected results even for the example in the comment:

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
笑看君怀她人 2024-11-06 05:07:35

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

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

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

It looks like you want to make sure the arrays have the same key/value pairs (strictly typed) but not necessarily in the same order. So, make the orders consistent and strictly compare them.

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

By way of testing,

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

I would also advise picking a better function name, your current choice is not going to do you any favours in the long run!

忘东忘西忘不掉你 2024-11-06 05:07:35

PHP 有一个用于此目的的函数。

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

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

PHP has a function for this.

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

$result will return everything that is different in the arrays. If they are the same it will return nothing.

把回忆走一遍 2024-11-06 05:07:35
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;

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

Basically we use array_diff() to check whatever there are any difference between the two given array. If there are not, then they are equal.

Despite this clean form, you could use the simple == to compare the two array.
Here's some tested samples:

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

This script output: truetruefalsefalse;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文