<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]。
---
###