前面看数组函数部分时用到了一些名称以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,如果有不对的地方,欢迎大家指正!