php array交集 PHP二维数组取差集操作方法
-07-11 23:14:16
来源: 非主流娱乐网责任编辑:小s0条评论
一、需求
PHP 中对二维数组取差集操作。
例如:
$arr1 和 $arr2 中我需要 去掉 $arr1 中 和 $arr2 相同的部分。
如下面的两个数组中,最后我需要的是 $arr1 中 ["id"=>102,"name"=>"ptbird","age"=>19];
注明: 其中 id 是在唯一的,也就在任何一个数组中 id 唯一
$arr1=[
0 => [
"id" => 100,
"name" => ptbird,
"age" => 19
],
1 => [
"id" => 101,
"name" => ptbird,
"age" => 19
],
2 => [
"id" => 102,
"name" => ptbird,
"age" => 19
],
];
$arr2=[
0 => [
"id" => 100,
"name" => ptbird,
"age" => 19
],
1 => [
"id" => 101,
"name" => ptbird,
"age" => 19
],
2 => [
"id" => 104,
"name" => ptbird2,
"age" => 19
],
]
二、实现
弄了两个函数:
1、 如果一个数组中没有唯一的id,使用下面这种方式
使用了 in_array() 和 闭包
注意最后的一个 array_filter() 能够重新索引数组,将空的索引给去掉
/**
* 使用in_array()对两个二维数组取差集
* - 去除$arr1 中 存在和$arr2相同的部分之后的内容
* @param $arr1
* @param $arr2
* @return array
*/
function get_diff_array_by_filter($arr1,$arr2){
try{
return array_filter($arr1,function($v) use ($arr2){
return !in_array($v,$arr2);
});
}catch (\Exception $exception){
return $arr1;
}
2.如果一个数组中某个key是唯一的,则通过key操作不适用 in_array()
/**
* 根据唯一字段对两个二维数组取差集
* - 去除$arr1 中 存在和$arr2相同的部分之后的内容
* - 返回差集数组
* @param $arr1
* @param $arr2
* @param string $pk
* @return array
*/
function get_diff_array_by_pk($arr1,$arr2,$pk='pid'){
try{
$res=[];
foreach($arr2 as $item) $tmpArr[$item[$pk]] = $item;
foreach($arr1 as $v) if(! isset($tmpArr[$v[$pk]])) $res[] = $v;
return $res;
}catch (\Exception $exception){
return $arr1;
}
}