一、函数介绍:
PHP数组交集计算函数,用来计算多个数组元素的共同交集。计算类型分为计算键名的交集、计算键值的交集、计算键名/值对的交集三类;计算方式分为系统默认函数计算和使用用户自定义函数计算两种。PHP数组交集计算函数共有8个。计算键名的交集:计算多个数组共同的键名交集(不考虑键值),返回时键名对应的键值保持不变一起返回。计算键名的交集函数有:array_intersect_key(),array_intersect_ukey()。
计算键值的交集:计算多个数组共同的键值交集(不考虑键名),返回时键值对应的键名保持不变一起返回。计算键值的交集函数有:array_intersect(),array_uintersect()。
计算键名/值对的交集:计算多个数组共同的键名/键值交集(同时考虑键名和键值)。计算键名/键值对的交集函数有:array_intersect_assoc(),array_uintersect_assoc(),array_intersect_uassoc(),array_uintersect_uassoc()。
数组交集比较函数功能差异表:http://aiezu.com/article/php_array_diff_sets.html
二、参数中的自定义比较函数:
交集比较函数通过比较键名、键值是否想等,来判断是否是相同的键名、键值。只有同时出现所有数组中的键名、键值才会在返回数组中返回。为了方便大家实现个性化的需求,PHP为部分函数提供了接口,可以使用自定义函数来比较键名、键值是否相等。PHP会传递两个键名给键名自定义比较函数、或者两个键值给自定义键值比较函数,用户可以在自定义比较函数中根据自己的需求进行比较,只需给自定义函数一个整型返回值就行(返回0认为键名或键值相等)。
自定义比较函数演示:
1、使用基础函数方式:<?php
//爱E族 aiezu.com
#键名比较函数
function user_key_compare_func($k1, $k2) {
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
#键值比较函数
function user_value_compare_func($v1, $v2) {
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}用法:<?php
array_intersect_ukey($arr1, $arr2, 'user_key_compare_func');
array_uintersect($arr1, $arr2, 'user_value_compare_func');
array_uintersect_uassoc($arr1, $arr2, 'user_value_compare_func', 'user_key_compare_func');
array_uintersect_uassoc($arr1, $arr2, $arr3, 'user_value_compare_func', 'user_key_compare_func');
2、使用类的函数方式:<?php
//爱E族:aiezu.com
class user {
function key_compare($k1, $k2) {
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
function value_compare($v1, $v2) {
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}
}用法:<?php
array_intersect_ukey($arr1, $arr2, array('user', 'key_compare'));
array_uintersect($arr1, $arr2, array('user', 'value_compare'));
array_uintersect_uassoc($arr1, $arr2, array('user', 'value_compare'), array('user', 'key_compare'));
三、用法演示:
1、使用基础自定义函数,作为比较函数完整代码:<?php
function user_key_compare_func($k1, $k2) {
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
function user_value_compare_func($v1, $v2) {
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}
$arr1 = array("name"=>'爱E族', "en"=>"aiezu", "type"=>"com");
$arr2 = array("name"=>'爱E族', 'en'=>'string', "suffix"=>'com');
print_r(array_intersect_ukey($arr1, $arr2, 'user_key_compare_func'));
print_r(array_uintersect($arr1, $arr2, 'user_value_compare_func'));
print_r(array_uintersect_uassoc($arr1, $arr2, 'user_value_compare_func', 'user_key_compare_func'));输出:Array
(
[name] => 爱E族
[en] => aiezu
)
Array
(
[name] => 爱E族
[type] => com
)
Array
(
[name] => 爱E族
)
2、使用类函数作为比较函数完整代码:<?php
class user {
function key_compare($k1, $k2) {
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
function value_compare($v1, $v2) {
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}
}
$arr1 = array("name"=>'爱E族', "en"=>"aiezu", "type"=>"com");
$arr2 = array("name"=>'爱E族', 'en'=>'string', "suffix"=>'com');
print_r(array_intersect_ukey($arr1, $arr2, array('user', 'key_compare')));
print_r(array_uintersect($arr1, $arr2, array('user', 'key_compare')));
print_r(array_uintersect_uassoc($arr1, $arr2, array('user', 'value_compare'), array('user', 'key_compare')));输出:Array
(
[name] => 爱E族
[en] => aiezu
)
Array
(
[name] => 爱E族
[type] => com
)
Array
(
[name] => 爱E族
)
3、交集比较函数的工作流程测试:
这里以array_uintersect_uassoc()函数举例解析交集比较函数的工作流程,array_uintersect_uassoc()用来计算多个数组共同的键名/键值交集(同时考虑键名和键值,键名、键值的比较都使用自定义函数)<?php
function user_key_compare_func($k1, $k2) {
echo sprintf("debug key: %s vs %s %s\n", $k1, $k2, $k1===$k2 ? 0 : ($k1>$k2?1:-1) ); //debug行
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
function user_value_compare_func($v1, $v2) {
echo sprintf("debug value: %s vs %s %s\n", $v1, $v2, $v1===$v2 ? 0 : ($v1>$v2?1:-1) ); //debug行
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}
$arr1 = array("name"=>'爱E族', "type"=>"domaim");
$arr2 = array("name"=>'爱E族', "type"=>'string');
$result = array_uintersect_uassoc($arr1, $arr2, "user_value_compare_func", "user_key_compare_func");
print_r($result);输出:debug key: type vs name 1 #$arr1键名的排序去重
debug key: type vs name 1 #$arr2键名的排序去重
debug key: name vs name 0 #键名相等、下步将比较键值是否相等
debug value: 爱E族 vs 爱E族 0 #键值也相等,将在返回数组中返回
debug key: type vs type 0 #键名相等、下步将比较键值是否相等
debug value: domaim vs string -1 #键值不相等,不会在返回数组中返回
Array
(
[name] => 爱E族
)