PHP 比较数组

2022-08-30 14:23:25

有没有使用内置函数来比较php中的数组,而不是做某种循环?

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

if (array_are_same($a1, $a2)) {
    // code here
}

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


答案 1
if ( $a == $b ) {
    echo 'We are the same!';
}

答案 2

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

!array_diff($a, $b) && !array_diff($b, $a);

这给出了两个数组是否具有相同的值(在类型杂耍之后)。 否则。例子:TRUEFALSE

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

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


如果重复必须有所作为,那就变得更加棘手。就“简单”值而言(只有字符串和整数值有效),array_count_values()发挥作用以收集有关数组中哪个值的频率的信息。此信息可以很容易地与以下信息进行比较:==

array_count_values($a) == array_count_values($b);

这给出了两个数组是否在相同的时间内具有相同的值(在类型杂耍之后)。 否则。例子:TRUEFALSE

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

这可以进一步优化,方法是首先比较两个数组的计数,这是相对便宜的,并且在计算重复值时区分大多数数组的快速测试会有所不同。


到目前为止,这些示例部分限于字符串和整数值,并且无法与任何一个进行严格的比较。更专门用于严格比较的是array_search。因此,需要对值进行计数和索引,以便可以对它们进行比较,因为只是将它们转换为键(就像这样)不会成功。array_diffarray_search

这是更多的工作。但是,最终比较与之前相同:

$count($a) == $count($b);

只是这才是有区别的:$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;
    };

这将保留一个值表,以便两个数组可以使用相同的索引。此外,还可以在第二个数组中第一次遇到新值时提前退出。

此函数还可以通过具有附加参数来添加严格上下文。通过添加另一个附加参数,可以允许查找重复项。完整示例:

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);
}

使用示例:

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