php 数组去重


一维数组的重复项

      使用array_unique函数即可,使用实例如下:

              <?php
                  $aa=array("apple","banana","pear","apple","wail","watermalon");
                  $bb=array_unique($aa);
                  print_r($bb);
               ?>

      结果如下:Array ( [0] => apple [1] =>banana [2] => pear [4] => wail [5]=> watermalon ) 。

二维数组的重复项

     对于二维数组咱们分两种情况讨论,一种是因为某一键名的值不能重复,删除重复项;另一种因为内部的一维数组不能完全相同,而删除重复项,下面举例说明:

           ㈠因为某一键名的值不能重复,删除重复项

          <?php
           function assoc_unique($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]);
               }
             else {
                 $tmp_arr[] = $v[$key];
               }
             }
           sort($arr); //sort函数对数组进行排序
           return $arr;
           }

           $aa = array(
           array('id' => 123, 'name' =>'张三'),
           array('id' => 123, 'name' =>'李四'),
           array('id' => 124, 'name' =>'王五'),
           array('id' => 125, 'name' =>'赵六'),
           array('id' => 126, 'name' =>'赵六')
           );
           $key = 'id';
           assoc_unique(&$aa, $key);
           print_r($aa);
           ?>

     显示结果为:Array ( [0] => Array ( [id] =>123 [name] => 张三 ) [1] => Array ([id] => 124 [name] => 王五 ) [2]=> Array ( [id] => 125 [name]=> 赵六 ) [3] => Array ( [id]=> 126 [name] => 赵六 ) )

       ㈡因内部的一维数组不能完全相同,而删除重复项

           <?php
           function array_unique_fb($array2D){
                foreach ($array2D as $v){
                    $v = join(",",$v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
                    $temp[] = $v;
                }
                $temp =array_unique($temp);   //去掉重复的字符串,也就是重复的一维数组
               foreach ($temp as $k => $v){
                   $temp[$k] = explode(",",$v);  //再将拆开的数组重新组装
               }
               return $temp;
           }

           $aa = array(
           array('id' => 123, 'name' =>'张三'),
           array('id' => 123, 'name' =>'李四'),
           array('id' => 124, 'name' =>'王五'),
           array('id' => 123, 'name' =>'李四'),
           array('id' => 126, 'name' =>'赵六')
           );
           $bb=array_unique_fb($aa);
           print_r($bb)
           ?>

         显示结果:Array ( [0] => Array ( [0] =>123 [1] => 张三 ) [1] => Array ( [0]=> 123 [1] => 李四 ) [2]=> Array ( [0] => 124 [1]=> 王五 ) [4] => Array ( [0]=> 126 [1] => 赵六 ))  


<think>我们正在处理一个关于PHP数组并删除空元素的问题。用户询问如何使用array_unique删除空元素,但array_unique本身只处理复值,不处理空元素。因此我们需要两个步骤:先删除空元素,再。参考引用:[^1]展示了如何对二维数组,但用户需求是一维数组,且要删除空元素。[^2]说明array_unique()用于删除复值。[^3]展示了array_unique()的简单用法,并提到array_values()可以新索引数组。[^4][^5]是关于array_unique内部实现的,与当前问题关系不大。因此,我们可以这样解决:1.使用array_filter()删除空元素(包括null,'',0,'0',false等,但注意0和'0'有时是有效值,所以可能需要自定义回调)。2.使用array_unique()复值。3.如果需要新索引数组,可以使用array_values()。注意:array_filter()默认会删除所有等价于false的值,如果只想删除严格空字符串或null,可以自定义回调函数。用户的问题:如何在PHP中对数组进行以及除空元素?步骤:1.除空元素:使用array_filter(),可以选择使用默认行为或自定义回调。2.复值:使用array_unique()。示例代码:假设我们有一个数组:$arr=array("a","b","","c","a",null,"b","0",0,"");如果我们想删除所有空元素(包括空字符串、null、0、'0'等),然后:注意:空格字符串""不是空的,所以不会被删除。如果只想删除空字符串和null,可以自定义回调。方案1:删除所有空值(等价于false的值)并:$arr=array("a","b","","c","a",null,"b","0",0,"");$filtered=array_filter($arr);//删除空字符串、null、0、'0'等$unique=array_unique($filtered);print_r($unique);结果:Array([0]=>a[1]=>b[3]=>c[9]=>)注意:索引会保留,所以可能不连续。方案2:如果我们只想删除空字符串和null,但保留0和'0'(因为0和'0'可能是有效数据),可以:$filtered=array_filter($arr,function($value){return$value!==''&&$value!==null;});$unique=array_unique($filtered);print_r($unique);结果:Array([0]=>a[1]=>b[3]=>c[7]=>0[8]=>0[9]=>)注意:这里0和'0'都被保留了,但是它们是复的吗?array_unique会认为0和'0'是不同的,因为类型不同。所以会同时保留。如果希望将0和'0'视为相同,我们需要在前统一类型,但这通常不是标准做法。所以一般根据需求选择。用户问题中提到了“空元素”,我们需要明确空元素的范围。但通常,使用array_filter()的默认行为即可。另外,如果要新索引,可以:$unique=array_values($unique);因此,完整的步骤是:1.过滤空值:array_filter($array)2.:array_unique($filteredArray)3.(可选)新索引:array_values($uniqueArray)示例代码:$array=array("apple","","banana","apple",null,"cherry","banana","0",0);$filteredArray=array_filter($array);$uniqueArray=array_unique($filteredArray);$reindexedArray=array_values($uniqueArray);print_r($reindexedArray);输出:Array([0]=>apple[1]=>banana[2]=>cherry[3]=>0//注意:这里0被保留,因为array_filter默认会删除0(因为0被视为false),但为什么这里还有0?)实际上,array_filter默认删除的是等价于false的值,包括false,0,'0','',null,array()等。但是上面的数组中有两个0:一个是字符串'0',一个是整数0。array_filter会删除整数0,但保留字符串'0'?因为字符串'0'在PHP中被视为false(PHP中字符串'0'被视为空,因为它在数字上下文中是0,且没有其他字符)。所以实际上,整数0和字符串'0'都会被array_filter删除。验证:上面的数组$array,经过array_filter()后,会得到:Array([0]=>apple[2]=>banana[3]=>apple[5]=>cherry[6]=>banana)因为空字符串、null、0、'0'都被删除了。所以后面的操作后,会得到apple,banana,cherry。如果用户希望保留0(整数0)和'0'(字符串0)作为有效值,那么就不能用默认的array_filter,而需要自定义回调,只删除空字符串和null。自定义回调:$filteredArray=array_filter($array,function($value){return$value!==null&&$value!=='';});这样,整数0和字符串'0'都会被保留。因此,我们根据用户对“空元素”的定义来选择不同的过滤方式。总结:1.如果空元素包括:null,空字符串(''),以及0和'0'(即所有等价于false的值),则使用array_filter($array)无回调。2.如果空元素仅指空字符串('')和null,则使用自定义回调:array_filter($array,function($value){return$value!==''&&$value!==null;});3.然后:array_unique($filteredArray)4.可选:新索引array_values()注意:array_unique会保留第一个出现的值,后续复的值会被删除。现在,我们按照用户的要求,给出一个通用的方法,并说明不同情况。同时,生成相关问题。</think>### 如何在 PHP 中删除数组复值并移除空元素 PHP 的 `array_unique()` 函数仅能删除复值,**无法直接移除空元素**。需要结合 `array_filter()` 函数分两步处理: #### 完整解决方案 ```php <?php // 原始数组(包含复值和空元素) $arr = ["apple", "", "banana", "apple", null, "cherry", "banana", "0", 0]; // 步骤1: 移除空元素(null/空字符串/0/'0') $filtered = array_filter($arr, function($value) { return $value !== null && $value !== ''; // 保留0和'0':删除此条件 }); // 步骤2: 删除复值 $unique = array_unique($filtered); // 步骤3(可选): 新索引数组 $result = array_values($unique); print_r($result); ?> ``` **输出**: ``` Array ( [0] => apple [1] => banana [2] => cherry [3] => 0 [4] => 0 ) ``` #### 关键函数说明: 1. **`array_filter($arr, $callback)`** - 作用:通过回调函数过滤空元素 - 回调逻辑:`return $value !== null && $value !== '';` (保留整数 `0` 和字符串 `"0"`,若需移除则添加 `&& $value !== 0 && $value !== '0'`) 2. **`array_unique($arr)`** - 作用:删除复值(保留首次出现的键)[^2][^3] 3. **`array_values($arr)`** - 作用:置数字索引(可选步骤)[^3] #### 处理不同空值场景: | 空值类型 | 是否默认移除 | 处理方式 | |----------------|-------------|----------------------------------| | `null` | 是 | `array_filter` 默认移除 | | `""` (空字符串) | 是 | `array_filter` 默认移除 | | `0` (整数零) | **否** | 需在回调中显式检查 `$value !== 0` | | `"0"` (字符串零)| **否** | 需在回调中显式检查 `$value !== '0'` | > ⚠️ **要提示**:`array_filter` 默认会移除所有 `false` 等价值(包括 `null`, `""`, `0`, `"0"`, `false`)。若需保留零值,必须使用自定义回调[^2][^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值