起因
在合并二维数组的时候,没有去重,导致数据重复了。所以就有了这个需求,根据一个和多个字段的重复,在合并二维数组并去掉重复数据。
方法1——网上找的方法
$arr1 = [
'1111'=>[
'attr_id' => '1111',
'attr_name' => 'Name1111',
'attr_value' => 'Value1111',
'attr_type' => 1,
'attr_time' => '2021-09-11'
],
'2222'=>[
'attr_id' => '2222',
'attr_name' => 'Name2222',
'attr_value' => 'Value2222',
'attr_type' => 2,
'attr_time' => '2021-09-12'
],
'3333'=>[
'attr_id' => '3333',
'attr_name' => 'Name3333',
'attr_value' => 'Value3333',
'attr_type' => 3,
'attr_time' => '2021-09-13'
],
];
$arr2 = [
'1111'=>[
'attr_id' => '1111',
'attr_name' => 'Name1111',
'attr_value' => 'Value1111',
'attr_type' => 1,
'attr_time' => '2021-11-11'
],
'4444'=>[
'attr_id' => '4444',
'attr_name' => 'Name4444',
'attr_value' => 'Value4444',
'attr_type' => 4,
'attr_time' => '2021-09-14'
],
'5555'=>[
'attr_id' => '5555',
'attr_name' => 'Name5555',
'attr_value' => 'Value5555',
'attr_type' => 5,
'attr_time' => '2021-09-15'
],
];
// 合并二维数组,并去重 ,如果filter 为空 ,完全字段去重
function array_merge_unique($arr1,$arr2,$filter=[]){
// 合并数组
$merge = array_merge($arr1,$arr2);
// 需要过滤的字段
$_merge = [];
if(!empty($filter)) {
$_v = array_fill_keys($filter, ' ');
foreach($merge as $k => $v) {
$_merge[$k] = array_intersect_key($v, $_v);
}
} else {
$_merge = $merge;
}
// 数组序列化
$_merge = array_map('serialize', $_merge);
// 数组去重
$_merge = array_unique($_merge);
// 数组反序列化
$_merge = array_map('unserialize', $_merge);
// 补充完整字段
if(!empty($filter)) {
return array_intersect_key($merge, $_merge);
} else {
return $_merge;
}
}
$arrNew = array_merge_unique($arr1,$arr2,['attr_id','attr_name']);
var_dump($arrNew);
方法2——我自己写的方法
// 合并二维数组,并去重 ,filter为空默认key值去重
function array_merge_unique_key($arr1,$arr2,$filter=[]){
$_arr1 = $_arr2 = [];
if (!empty($filter)) {
// 把filter 构造成key
array_walk($arr1, function (&$val,$key) use($filter,&$_arr1)
{
$_row;
foreach($filter as $fv){
$_row[] = $val[$fv];
}
$key = implode('_', $_row);
$_arr1[$key] = $val;
});
array_walk($arr2, function (&$val,$key) use($filter,&$_arr2)
{
$_row;
foreach($filter as $fv){
$_row[] = $val[$fv];
}
$key = implode('_', $_row);
$_arr2[$key] = $val;
});
var_dump($_arr2);
}else{
//如果没有filter,默认用key去重合并
$_arr1 = $arr1;
foreach($arr2 as $k => $v){
//去掉数组中已存在的数据
if ( !isset($_arr1[$k]) ) {
$_arr2[$k] = $v;
}
}
}
if (!empty($_arr2)) {
// array_merge 在合并数组的时候,会根据key去重
return array_values(array_merge($_arr1,$_arr2));
}else{
return $_arr1;
}
}
$arrNew = array_merge_unique_key($arr1,$arr2,['attr_id','attr_name']);
var_dump($arrNew);
总结
这两个方法是两种不同思维方式来去重重复的,方法1是通过数据,把重复数据去重;方法2是运用php中数组key来做的去重。大家还有什么新的思路?欢迎留言。
需要注意:在使用array_merge 合并数组时,只有key为字符串(不能是纯数字的字符串)的时候,才能达到去重的目的,如果是数字是不能去重的。
不过这两种方法,都没有保留原有数组的key值,知道为什么吗?欢迎留言。
参考文档
这样的二维数组合并并去掉重复值,该怎么做-CSDN论坛
PHP二维数组如何去掉重复值 - 以为是帅哥 - 博客园
|