PHP比较数组

27 php arrays comparison

无论如何使用内置函数比较php中的数组,而不是做某种循环?

$a1 = array(1,2,3);
$a2 = array(1,2,3);

if (array_are_same($a1, $a2)) {
    // code here
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,数组值并不总是以相同的顺序.

Ala*_*avi 36

if ( $a == $b ) {
    echo 'We are the same!'
}
Run Code Online (Sandbox Code Playgroud)

  • 这也要求数组键也匹配,根据PHP文档中的数组比较示例:http://php.net/manual/en/language.operators.comparison.php (8认同)
  • @JonL.`if(array_values($ a)== array_values($ b){}`?? (2认同)
  • @EricHolmes,如对另一个答案的评论所述,仅在顺序相同时才有效:http://stackoverflow.com/questions/901815/php-compare-array/901831?noredirect=1#comment19924354_901830 (2认同)

hak*_*kre 28

比较两个数组是否具有相同的值(重复与否,考虑到类型 - 杂耍)可以通过使用array_diff()两个方向来完成:

!array_diff($a, $b) && !array_diff($b, $a);
Run Code Online (Sandbox Code Playgroud)

这给出了TRUE两个数组是否具有相同的值(在类型杂耍之后).FALSE除此以外.例子:

function array_equal_values(array $a, array $b) {
    return !array_diff($a, $b) && !array_diff($b, $a);
}

array_equal_values([1], []);            # FALSE
array_equal_values([], [1]);            # FALSE
array_equal_values(['1'], [1]);         # TRUE
array_equal_values(['1'], [1, 1, '1']); # TRUE
Run Code Online (Sandbox Code Playgroud)

如此示例所示,array_diff将数组键排除在等式之外,并且不关心值的顺序,也不关心值是否重复.


如果重复必须有所作为,这就变得更加棘手.就"简单"值而言(只有字符串和整数值有效),array_count_values()可以收集有关哪些值是数组内部频率的信息.这些信息可以很容易地与==以下内容进

array_count_values($a) == array_count_values($b);
Run Code Online (Sandbox Code Playgroud)

这给出了TRUE两个数组在相同的时间内具有相同的值(在类型 - 杂耍之后).FALSE除此以外.例子:

function array_equal_values(array $a, array $b) {
    return array_count_values($a) == array_count_values($b);
}

array_equal_values([2, 1], [1, 2]);           # TRUE
array_equal_values([2, 1, 2], [1, 2, 2]);     # TRUE
array_equal_values(['2', '2'], [2, '2.0']);   # FALSE
array_equal_values(['2.0', '2'], [2, '2.0']); # TRUE
Run Code Online (Sandbox Code Playgroud)

这可以通过首先比较相对便宜的两个阵列的数量和快速测试来进一步优化,以便在计数值重复产生差异时将大多数阵列分开.


到目前为止,这些示例部分限于字符串和整数值,并且array_diff两者都不能进行严格的比较.更专注于严格比较array_search.因此,需要对值进行计数和索引,以便可以将它们进行比较,因为只需将它们转换为键(就像array_search)就不会成功.

这是一项更多的工作.但最终比较与之前相同:

$count($a) == $count($b);
Run Code Online (Sandbox Code Playgroud)

这只是$count有所不同:

    $table = [];
    $count = function (array $array) use (&$table) {
        $exit   = (bool)$table;
        $result = [];
        foreach ($array as $value) {
            $key = array_search($value, $table, true);

            if (FALSE !== $key) {
                if (!isset($result[$key])) {
                    $result[$key] = 1;
                } else {
                    $result[$key]++;
                }
                continue;
            }

            if ($exit) {
                break;
            }

            $key          = count($table);
            $table[$key]  = $value;
            $result[$key] = 1;
        }

        return $result;
    };
Run Code Online (Sandbox Code Playgroud)

这会保留一个值表,以便两个数组都可以使用相同的索引.此外,可以在第二个阵列中第一次提前退出,体验新值.

此函数还可以通过添加其他参数来添加严格上下文.然后通过添加另一个附加参数,可以允许查找重复项.完整的例子:

function array_equal_values(array $a, array $b, $strict = FALSE, $allow_duplicate_values = TRUE) {

    $add = (int)!$allow_duplicate_values;

    if ($add and count($a) !== count($b)) {
        return FALSE;
    }

    $table = [];
    $count = function (array $array) use (&$table, $add, $strict) {
        $exit   = (bool)$table;
        $result = [];
        foreach ($array as $value) {
            $key = array_search($value, $table, $strict);

            if (FALSE !== $key) {
                if (!isset($result[$key])) {
                    $result[$key] = 1;
                } else {
                    $result[$key] += $add;
                }
                continue;
            }

            if ($exit) {
                break;
            }

            $key          = count($table);
            $table[$key]  = $value;
            $result[$key] = 1;
        }

        return $result;
    };

    return $count($a) == $count($b);
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

array_equal_values(['2.0', '2', 2], ['2', '2.0', 2], TRUE);           # TRUE
array_equal_values(['2.0', '2', 2, 2], ['2', '2.0', 2], TRUE);        # TRUE
array_equal_values(['2.0', '2', 2, 2], ['2', '2.0', 2], TRUE, FALSE); # FALSE
array_equal_values(['2'], ['2'], TRUE, FALSE);                        # TRUE
array_equal_values([2], ['2', 2]);                                    # TRUE
array_equal_values([2], ['2', 2], FALSE);                             # TRUE
array_equal_values([2], ['2', 2], FALSE, TRUE);                       # FALSE
Run Code Online (Sandbox Code Playgroud)


psc*_*eit 12

@Cleanshooter我很抱歉,但这没有做,预计会发生什么:(在此上下文中提到的array_diff也是如此)

$a1 = array('one','two');
$a2 = array('one','two','three');

var_dump(count(array_diff($a1, $a2)) === 0); // returns TRUE
Run Code Online (Sandbox Code Playgroud)

(注释:你不能在PHP 5.5之前使用空函数)在这种情况下,结果是真的,尽管数组是不同的.

array_diff [...]返回一个数组,其中包含array1中任何其他任何数组中都不存在的条目.

这并不意味着array_diff是这样的:array_get_all_differences.在数学集中解释它计算:

{'one','two'} \ {'one','two','three'} = {}
Run Code Online (Sandbox Code Playgroud)

这意味着类似于第一组中的所有元素,而没有第二组中的所有元素,这些元素位于第一组中.以便

var_dump(array_diff($a2, $a1));
Run Code Online (Sandbox Code Playgroud)

计算到

array(1) { [2]=> string(5) "three" } 
Run Code Online (Sandbox Code Playgroud)

结论是,你必须以array_diff"两种方式"做到从两个数组中获得所有"差异".

希望这可以帮助 :)


小智 5

您也可以尝试这样的方式:

if(serialize($a1) == serialize($a2))
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 3

只要检查一下$a1 == $a2——有什么问题吗?

  • 这还要求数组键也匹配,根据 PHP 文档中找到的数组比较示例:php.net/manual/en/language.operators.comparison.php (3认同)