加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – 试图理解array_uintersect行为

发布时间:2021-08-28 03:44:36 所属栏目:大数据 来源: https://www.jb51.cc
导读:我们继续吧.为什么0700在sorting之后没有compare values的第一阵列?根据我的拙见,array_udiff和array_uintersect应该有类似的算法,但他们没有.为什么? $compare = function($a, $b) use($iteration_count) { echo("$a : $bn"); $iteration_count++; retur

我们继续吧.为什么0700在sorting之后没有compare values的第一阵列?根据我的拙见,array_udiff和array_uintersect应该有类似的算法,但他们没有.为什么?

$compare = function($a, $b) use(&$iteration_count)
    {
    echo("$a : $bn");
    $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_countnn";

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

产量

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()和朋友采用的算法首先假设第一个数组的所有值都存在于其他数组中;在迭代期间,它将删除未通过此断言的元素.

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

>将下一个元素与当前元素进行比较,并在它们相等时从最终结果中删除(这是diff的作用)
>将下一个元素与其他数组的最后一个被检查元素进行比较,并将其从最终结果中删除,直到它变大(或者到达数组的末尾).

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

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

function cmp_val($a, $b)
{
    echo "$a <=> $bn";
    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一样;如果任何其他数组中不存在该值,则使用另一种策略.

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读