【问题标题】:why does array_intersect_uassoc() compare array keys within the same array?为什么 array_intersect_uassoc() 比较同一数组中的数组键?
【发布时间】:2014-01-28 15:40:35
【问题描述】:

这是一个使用 array_intersect_uassoc() 的示例。

我故意将键设置为不同的,这样你就可以分辨出哪个来自哪个数组。

$array1 = array("LEFT a" => "green", "LEFT b" => "brown", "LEFT c" => "blue"); $array2 = array("RIGHT a" => "GREEN", "RIGHT B" => "brown", 'RIGHT y' => "yellow"); array_intersect_uassoc($array1, $array2, 函数($a, $b) { print_r("$a -- $b"); 返回0; });

在输出中,我看到了两个 LEFT 键和两个 RIGHT 键的比较。

这样做到底有什么意义?

【问题讨论】:

  • 因为如果LEFT a == LEFT b,您只需要检查== RIGHT a是否其中之一,而不是两者。节省时间/是为了效率。现在有点,但在更大的阵列上,这可以加起来。
  • 但它们是数组键,因此根据定义,一个数组中的任何键都不能相等。它们是 无关紧要,因为我们不是在排序,而是在过滤。

标签: php arrays


【解决方案1】:

查看函数的逻辑代码(我简化了一点):

function array_intersect_uassoc($args, compare_func) 
{
    $result = array();
    $array_count = count($args);
    foreach ($args[0] as $k => $v) {
        for ($i = 0; $i < $array_count; $i++) {
            $match = false;
            foreach ($args[$i] as $kk => $vv) {
                $compare = call_user_func_array($compare_func, array($k, $kk));
                if ($compare === 0 && $v == $vv) {
                    $match = true;
                    continue 2;
                }
            }
            if ($match === false) {
                continue 2;
            }
        }

        if ($match === true) {
            $result[$k] = $v;
        }
    }
    return $result;
}

这有助于您了解检查的不只是键,更重要的是检查值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多