PHP二维数组数据去重的两种方式

本文介绍了两种在开发中常用的数组去重方法,一种是逐个检查并删除重复项,另一种是封装静态函数实现按指定字段去重,并重构数组结构。适合处理二维数组的重复问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在开发过程中难免会遇到数据有重复的问题,那么下面给大家分享一个比较有效的方法。

(1)第一种方式

//二维数组数据去重
            $temp=[];
            foreach($label_name as $k=>$v){
                if(!in_array($v['name'],$temp)){
                    $temp[]=$v['name'];
                }else{
                    unset($label_name[$k]);
                }
            }
$label_name是你的数组
$v['name']的name是你希望根据哪个字段去重的字段名

//把去重后的数组重构一下,因为key可能会出现0 1 3的情况
            $label_arr=[];
            foreach ($label_name as $kk=>$vv){
                $label_arr1['label_id']=$vv['label_id'];
                $label_arr1['name']=$vv['name'];
                array_push($label_arr,$label_arr1);
            }
            $videoList[$key]['label']=$label_arr;

(2)第二种方式 可以自己封装起来,用到的时候调用即可

注:$arr为你去重的数组 $key为你要根据哪个字段去去重


static function second_array_unique_bykey($arr, $key){
    $tmp_arr = array();
    foreach($arr as $k => $v)
    {
        if(in_array($v[$key], $tmp_arr))   //搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true
        {
            unset($arr[$k]); //销毁一个变量  如果$tmp_arr中已存在相同的值就删除该值
        }
        else {
            $tmp_arr[$k] = $v[$key];  //将不同的值放在该数组中保存
           // array_push($tmp_arr,$v[$key]);
        }
    }
    //ksort($arr); //ksort函数对数组进行排序(保留原键值key)  sort为不保留key值
    return $arr;
}

### 如何合并三个数组对象并 对于合并三个数组对象并且复元素的任务,可以采用多种方法来完成这一目标。当处理的是基本类型的数组时,利用集合(`Set`)是一种高效的方式[^4];然而,如果是对象数组,则需要更复杂的逻辑来进行比较。 #### 使用 JavaScript 实现基于 `Set` 的简单 针对基本类型的数据,下面是一个简单的例子: ```javascript function mergeAndDeduplicateArrays(arr1, arr2, arr3) { const combinedArray = [...arr1, ...arr2, ...arr3]; return [...new Set(combinedArray)]; } ``` 这段代码首先通过扩展运算符(`...`)将所有的输入数组连接成一个新的单一数组,之后再创建一个新集合作为返回的结果,在此过程中自动过滤掉了任何复项。 #### 对象数组的合并与 但是,如果要处理的对象不是基础数据类型而是复杂结构体的话,上述方法就不再适用了。此时应该考虑按照特定属性进行对比或者使用JSON字符串化的方式来辅助判断两个对象是否相等。 这里给出一种解决方案,它会根据指定键名对对象数组执行操作: ```javascript function dedupeObjectsByKey(arrayOfObjects, keyName) { let seenKeys = new Map(); return arrayOfObjects.filter(item => !seenKeys.has(item[keyName]) && seenKeys.set(item[keyName], true)); } // 假设有如下三个对象数组待合并 const arrayOne = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}]; const arrayTwo = [{id: 2, name: 'Charlie'}, {id: 3, name: 'David'}]; const arrayThree = [{id: 4, name: 'Eve'}, {id: 5, name: 'Frank'}]; // 首先合并这些数组 let merged = [...arrayOne, ...arrayTwo, ...arrayThree]; // 接着调用函数按'id'字段 let uniqueById = dedupeObjectsByKey(merged, "id"); console.log(uniqueById); ``` 在这个例子中,定义了一个名为 `dedupeObjectsByKey()` 的函数接收两个参数:一个是对象数组列表,另一个是要用来作为唯一性的依据的关键字名称。该算法遍历整个数组,并只保留那些其给定关键字首次出现过的条目。 #### PHP 处理多维数组的情况 考虑到PHP环境下的情况,特别是涉及到二维或多维度关联数组的情况下,可以通过序列化或自定义条件来进行有效的工作[^2]。例如: ```php <?php $allComments = [ ['post_id'=>1,'comment'=>'Comment A'], ['post_id'=>2,'comment'=>'Comment B'], ['post_id'=>1,'comment'=>'Different Comment'] ]; // 序列化方式适用于完全相同的子数组 $result = array_unique($allComments,SORT_REGULAR); print_r($result); // 这里只会移除真正意义上完全一样的记录 // 如果想要根据某个具体字段比如'post_id'来做 $temp = []; foreach ($allComments as $item){ $temp[$item['post_id']]=$item; } $result = array_values($temp); print_r($result); // 此种情况下即使其他字段不同也会被视作同一个项目而覆盖掉之前的值 ?> ``` 以上展示了两种不同的场景下如何有效地合并多个数组以及如何除非必要的冗余信息。无论是JavaScript还是PHP环境下都有各自适合的技术手段可供选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值