php – 试图理解array_uintersect行为

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 试图理解array_uintersect行为脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我们继续吧.为什么0700在 sorting之后没有 compare values的第一阵列?根据我的拙见,array_udiff和array_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,$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

@R_404_1964@

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 <=> $b\n";
    return strcmp($a[0],$b[0]);
}

PRint_r(array_uintersect($a,'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行为全部内容,希望文章能够帮你解决php – 试图理解array_uintersect行为所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。