【小白笔记】PHP学习之路 (17) --通过回调函数得到数组交集或差集

前面看数组函数部分时用到了一些名称以u开头的数组处理函数,这些函数都是通过回调函数对数组进行处理。

个人理解这里的“u”即“user-defined”吧(也不知道对不对)。

差集:

     一个相对于其他数组所特有的部分的集合。

交集:

     数组之间相同的部分。

array_udiff()   通过回调函数,比较多个数组的差值。返回差集。

如果两个数组长度一样的话,可以这样找出差集:

	$arr1 = array("a"=>"avalue","b"=>"bvalue","c"=>"cvalue");
	$arr2 = array("a"=>"avalue","b"=>"bvalue1","c"=>"cvalue1");
	function func($v1,$v2){
		if($v1 === $v2) return 0;
		return 1;
	}
	$arr3 = array_udiff($arr1,$arr2,"func");
	echo "<pre>";
	print_r($arr3);

结果:

Array
(
    [b] => bvalue
    [c] => cvalue
)

但是,如果$arr2["c"]的值改成跟$arr1的一样的话,就会出现问题:

	$arr1 = array("a"=>"avalue","b"=>"bvalue","c"=>"cvalue");
	$arr2 = array("a"=>"avalue","b"=>"bvalue1","c"=>"cvalue");

结果:

Array
(
    [b] => bvalue
    [c] => cvalue
)

另外,当两个数组长度不一样时,也会出现不想要的结果:

	$arr1 = array("a"=>"avalue","b"=>"bvalue","c"=>"cvalue");
	$arr2 = array("a"=>"avalue","b"=>"bvalue","c"=>"cvalue","d"=>"dvalue");

结果:

Array
(
    [c] => cvalue
)

这时,可以修改回调函数的返回值:

	function func($v1,$v2){
		if($v1 === $v2) return 0;
		if($v1 > $v2) return 1;
		if($v1 < $v2) return -1;
	}

这时就正常了:

Array
(
)

array_udiff_assoc()   通过回调函数,比较多个数组的键名和键值。返回差集。(逻辑或)

这里回调函数的用法也是一样的:
	$arr1 = array("a"=>"avalue","b"=>"bvalue","c"=>"cvalue");
	$arr2 = array("a1"=>"avalue","b"=>"bvalue1","c"=>"cvalue","d"=>"dvalue");
	function func($v1,$v2){
		if($v1 === $v2) return 0;
		if($v1 > $v2) return 1;
		if($v1 < $v2) return -1;
	}
	$arr3 = array_udiff_assoc($arr1,$arr2,"func");
	echo "<pre>";
	print_r($arr3);

结果:
Array
(
    [a] => avalue
    [b] => bvalue
)

array_udiff_uassoc()   通过两个回调函数,比较多个数组的键名和键值。返回差集。(逻辑或)

	function func($v1,$v2){
		if($v1 === $v2) return 0;
		if($v1 > $v2) return 1;
		if($v1 < $v2) return -1;
	}
	$arr3 = array_udiff_uassoc($arr1,$arr2,"func","func");

结果是一样的。

array_uintersect()  通过回调函数比较多个数组的键值。返回交集。(逻辑且)

array_uintersect_uassoc()    通过两个回调函数比较多个数组的键名和键值。返回交集。(逻辑且)

PHP函数众多,但是命名都十分语义化。这样的好处就是一看名字就知道函数的作用。从上面可以看出,
数组处理函数都以array开头,以下划线作为分隔符,diff意为比较不同点(difference),而intersect为比较相同点,
assoc意为键名和键值一起比较,估计是associated的意思吧。后面加上key为比较键名,未加key即为比较键值。
加上u,则表示比较规则由使用者自定义,即user-defined。
带diff_assoc的比较不同点时,当键名和键值两者有一个不同即为不同,是逻辑或的关系;
带intersect_assoc的比较相同点时,当键名和键值都相同时才相同,是逻辑且的关系。
这样记忆就显得简单许多了。


以上均为个人理解,初学php,如果有不对的地方,欢迎大家指正!微笑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值