和 array_intersect 类似,只不过 array_uintersect* 系列函数的值比较使用自定义函数;
键的比较,array_uintersect、array_uintersect_assoc 是使用内置方法, array_uintersect_uassoc 是使用自定义函数。
<?php
// array_uintersect 用自定义函数比较数组的交值(array_intersect 使用内置函数)
// 使用该函数我们通过进行更复杂的比较
class Rectangle
{
public $width;
public $height;
public function __construct($width, $height)
{
$this->width = $width;
$this->height = $height;
}
}
$array1 = [
'a' => new Rectangle(1, 2),
'b' => new Rectangle(2, 3),
'c' => new Rectangle(3, 5),
];
$array2 = [
'a' => new Rectangle(2, 3),
'c' => new Rectangle(3, 5),
];
// 键比较函数
function compare_key($key1, $key2) {
if ($key1 == $key2) {
return 0;
}
return $key1 > $key2 ? 1 : -1;
}
// 值比较函数
function compare_area(Rectangle $value1, Rectangle $value2) {
$area1 = $value1->width * $value1->height;
$area2 = $value2->width * $value2->height;
if ($area1 == $area2) {
return 0;
}
return $area1 > $area2 ? 1 : -1;
}
// 返回数组交集, 只比较值 (值的比较使用自定义函数)
var_dump(array_uintersect($array1, $array2, 'compare_area'));
// 返回数组交集, 同时比较键和值(值的比较使用自定义函数, 键的比较使用内置方法)
var_dump(array_uintersect_assoc($array1, $array2, 'compare_area'));
// 返回数组交集, 同时比较键和值(值的比较使用自定义函数,键的比较使用自定义函数)
var_dump(array_uintersect_uassoc($array1, $array2, 'compare_area', 'compare_key'));
输出:
array(2) {
["b"]=>
object(Rectangle)#2 (2) {
["width"]=>
int(2)
["height"]=>
int(3)
}
["c"]=>
object(Rectangle)#3 (2) {
["width"]=>
int(3)
["height"]=>
int(5)
}
}
array(1) {
["c"]=>
object(Rectangle)#3 (2) {
["width"]=>
int(3)
["height"]=>
int(5)
}
}
array(1) {
["c"]=>
object(Rectangle)#3 (2) {
["width"]=>
int(3)
["height"]=>
int(5)
}
}