gpt4 book ai didi

php - 试图理解 array_uintersect 行为

转载 作者:可可西里 更新时间:2023-10-31 23:19:42 26 4
gpt4 key购买 nike

让我们继续。为什么 array_uintersect没有 compare values sorting 之后的第一个数组?依我拙见,array_udiffarray_uintersect 应该有相似的算法,但他们没有。为什么?

$compare = function($a, $b) use(&$iteration_count)
{
echo("$a : $b\n");
$iteration_count++;
return strcmp($a, $b);
};

$a = array('a', 'b', 'c');
$b = array('x', 'y', 'z');

$iteration_count = 0;
echo "array_udiff:" . json_encode(array_udiff($a, $b, $compare)) . "\n";
echo "iterations: $iteration_count\n\n";

$iteration_count = 0;
echo "array_uintersect:" . json_encode(array_uintersect($a, $b, $compare)) . "\n";
echo "iterations: $iteration_count\n\n";

输出

b : a
c : b
y : x
z : y
a : x
a : b
b : x
b : c
c : x
array_udiff:["a","b","c"]
iterations: 9

b : a
c : b
y : x
z : y
a : x // comparison started
b : x // but there is no comparison to skip values
c : x
array_uintersect:[]
iterations: 7

最佳答案

array_intersect() 及其 friend 采用的算法是首先假定第一个数组的所有值都存在于其他数组中;在迭代期间,它将删除未通过此断言的元素。

当在其他数组之一中找不到元素时,实现可以做两件事:

  1. 将下一个元素与当前元素进行比较,并在它们相等时从最终结果中移除(这就是 diff 所做的)
  2. 将下一个元素与其他数组的最后一个检查元素进行比较,并不断从最终结果中删除它,直到它更大(或到达数组末尾)。

如果是PHP,则选择后者。这有一点优势,因为它可以跳过大于当前元素但小于其他数组的最后一个检查元素的值。例如:

$a = ['a.a0', 'a.a1', 'b.a2', 'c.a3'];
$b = ['a.c0', 'd.c1'];

function cmp_val($a, $b)
{
echo "$a <=> $b\n";
return strcmp($a[0], $b[0]);
}

print_r(array_uintersect($a, $b, 'cmp_val'));

输出:

...
-- intersect starts
a.a0 <=> a.c0
a.a0 <=> a.a1 <-- match
a.a1 <=> b.a2
b.a2 <=> d.c1 <-- no match
c.a3 <=> d.c1

如您所见,它使用的策略是在第一个数组中比较一个值是否出现在所有其他数组中,就像 diff 一样;如果该值不存在于任何其他数组中,则使用其他策略。

关于php - 试图理解 array_uintersect 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28869224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com