php – 试图理解array_uintersect行为
发布时间:2020-12-13 16:55:44 所属栏目:PHP教程 来源:网络整理
导读:我们继续吧.为什么0700在 sorting之后没有 compare values的第一阵列?根据我的拙见,array_udiff和array_uintersect应该有类似的算法,但他们没有.为什么? $compare = function($a,$b) use($iteration_count) { echo("$a : $bn"); $iteration_count++; retu
我们继续吧.为什么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,$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,'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一样;如果任何其他数组中不存在该值,则使用另一种策略. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |