PHP 数组过滤空值 array_filter

使用array_filter函数过滤数组
array_filter函数允许你通过回调函数筛选数组元素,保留使回调函数返回true的项。默认情况下,它会移除所有空值。示例中展示了如何过滤空值以及使用自定义回调函数过滤掉小于等于5的值。
array_filter
使用回调函数过滤数组的元素,返回过滤后的数组。
遍历 array 数组中的每个值,并将每个值传递给 callback 回调函数。 如果 callback 回调函数返回 true,则将 array 数组中的当前值返回到结果 array 数组中。数组键名保持不变。
如果没有提供 callback 回调函数,将删除数组中 array 的所有“空”元素。
示例一:

复制代码
// 不使用回调函数,可以过滤空值
$entry = [
    0 => 'foo',
    1 => false,
    2 => -1,
    3 => null,
    4 => '',
    5 => '0',
    6 => 0,
];
print_r(array_filter($entry));
 
## 返回结果
Array
(
    [0] => foo
    [2] => -1
)
示例二:

复制代码
// 使用回调函数
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$return_array = array_filter($array, function ($value) {
    // 过滤小于等于5的值
    return $value > 5 ? true : false;
});
print_r($return_array);
 
## 返回结果
Array
(
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
)

<think>我们已知用户想要在PHP中移除数组空值的方法。参考站内引用内容,我们可以总结出几种常见的方法: 1. 使用array_filter()函数:这是最直接的方法,可以过滤数组中的空值(包括空字符串、0、false、null等)。但注意,如果数组中有0且不希望被过滤,需要自定义回调函数。 2. 递归方法:当数组是多维数组时,需要递归处理每个元素。引用[1]中提供了一个递归函数array_remove_empty()。 3. 结合array_walk()或array_map()等函数处理多维数组:引用[3]提到了使用array_walk()来处理二维数组,我们可以借鉴其思想来处理多维数组空值。 根据用户引用的内容,我们将分别介绍这些方法,并给出示例代码。 方法一:使用array_filter()函数(适用于一维数组) 注意:默认情况下,array_filter()会将所有等同于false的值都过滤掉(如false, null, '', 0, '0')。如果只想过滤空字符串和null,可以自定义回调函数。 方法二:递归删除空值(适用于多维数组) 引用[1]提供了一个递归函数array_remove_empty(),我们可以参考并改进。 方法三:使用array_map()结合array_filter()处理二维数组(适用于二维数组,也可以递归扩展到多维) 下面我们详细说明: 一、使用array_filter()处理一维数组 示例代码: $arr = array('foo', '', 'bar', null, 0, false, '0'); $filtered = array_filter($arr); 此时,$filtered将包含:['foo', 'bar'],因为0、false、'0'、null、''都被移除了。 如果只想移除空字符串和null,保留0和false,可以自定义回调函数: $filtered = array_filter($arr, function($value) { return $value !== '' && $value !== null; }); 二、递归删除多维数组中的空值 参考引用[1]中的函数,我们稍作改进(使用foreach替代each,因为each在PHP7.2+已被废弃): function array_remove_empty($arr) { if (!is_array($arr)) { return $arr; // 如果不是数组,直接返回 } $narr = array(); foreach ($arr as $key => $val) { if (is_array($val)) { $val = array_remove_empty($val); // 递归处理子数组 // 过滤后,如果子数组为空,也可以选择是否保留。这里我们保留非空数组 if (count($val) > 0) { $narr[$key] = $val; } } else { // 对于非数组元素,我们自定义条件:不为空字符串、不为null if ($val !== '' && $val !== null) { $narr[$key] = $val; } } } return $narr; } 注意:这个递归函数会移除所有空字符串和null,但不会移除0、false等。如果需要移除更多类型,可以修改条件。 三、使用array_walk_recursive()? 注意:array_walk_recursive()只能遍历到叶子节点,不能移除整个子树(即如果某个子数组全部为空,它不能移除该子数组的键)。所以我们还是推荐递归函数。 另外,引用[4]也提到了array_filter(),但没有递归处理。 因此,我们根据数组维度选择: - 一维数组:直接array_filter()。 - 多维数组:使用递归函数。 示例:二维数组变一维数组(引用[3])不是移除空值,而是抽取某一列,所以这里不适用。 我们给出完整的示例代码: 示例1:一维数组移除空值 $arr = array(0, 1, '', null, 'hello', false, true, array()); $result = array_filter($arr); // 移除所有false值 print_r($result); 示例2:多维数组移除空值(使用递归函数) $arr = array( 'a' => 0, 'b' => '', 'c' => array( 'd' => null, 'e' => 'non-empty', 'f' => array( 'g' => '' ) ) ); $result = array_remove_empty($arr); print_r($result); 结果:保留'a'=>0,因为0不是空字符串也不是null;'c'中只有'e'=>'non-empty'被保留,并且整个子数组'f'被移除(因为它里面只有空字符串,递归后变为空数组,然后被移除)。 注意:上述递归函数中,我们移除了空字符串和null,同时对于子数组,如果递归后为空数组,也会被移除。 如果用户有不同需求(比如希望保留0或false),可以调整条件。 最后,我们总结: PHP移除数组空值的方法主要有: 1. 使用array_filter()及其回调函数控制移除条件(一维数组) 2. 使用递归函数(多维数组) 相关问题: 1. 如何保留0和false而只移除空字符串和null? 2. 如何移除数组中的空数组? 3. 使用array_filter()时,如何保留数组的键? 现在,我们按照要求写出回答。 </think>在 PHP 中移除数组空值有多种高效方法,以下是最常用的三种技术方案,根据数组维度和需求选择最佳方案: ### 一、基础方法:`array_filter()` 函数(推荐一维数组) ```php $arr = [0, "", null, false, "data", [], "0"]; $result = array_filter($arr); print_r($result); ``` **输出**: ``` Array ( [4] => data ) ``` **特点**: 1. 默认移除所有**假值**(false-equivalent):`""`、`0`、`"0"`、`null`、`false`、`[]`[^4] 2. **保留键名**不变 3. 处理一维数组效率最高(时间复杂度 $O(n)$) > 自定义过滤规则(例如仅移除 `null` 和空字符串): > ```php > $result = array_filter($arr, function($val) { > return $val !== null && $val !== ''; > }); > ``` ### 二、多维数组递归方案 ```php function remove_empty_recursive($arr) { foreach ($arr as $key => $val) { if (is_array($val)) { $arr[$key] = remove_empty_recursive($val); // 递归处理子数组 if (empty($arr[$key])) unset($arr[$key]); // 移除空子数组 } elseif ($val === "" || $val === null) { unset($arr[$key]); // 移除当前空值 } } return $arr; } // 测试数据 $data = [ 'name' => '齐全', 'empty_str' => '', 'address' => ['province' => '广东', 'detail' => null], 'empty_arr' => [] ]; print_r(remove_empty_recursive($data)); ``` **输出**: ``` Array ( [name] => 齐全 [address] => Array ( [province] => 广东 ) ) ``` **特点**: 1. 深度遍历嵌套数组(支持任意维度) 2. 同时移除**空子数组** 3. 可按需自定义空值判断标准[^1] ### 三、`array_walk()` + 引用方案(保留键名) ```php $arr = ["A" => 1, "B" => "", "C" => null]; array_walk($arr, function(&$val, $key) { if ($val === "" || $val === null) $val = '__REMOVE__'; }); $result = array_diff($arr, ['__REMOVE__']); print_r($result); ``` **输出**: ``` Array ( [A] => 1 ) ``` **适用场景**: 1. 需要精确控制空值类型时 2. 要求严格保留原始键名顺序 3. 避免创建新数组的内存开销[^3] --- ### 方案对比表 | 方法 | 支持维度 | 保留键名 | 移除空数组 | 时间复杂度 | |-----------------------|------------|----------|------------|------------| | `array_filter()` | 一维 | ✓ | ✗ | $O(n)$ | | 递归方案 | 多维 | ✓ | ✓ | $O(n)$ | | `array_walk()` + 引用 | 一维/二维 | ✓ | ✗ | $O(n)$ | > **最佳实践建议**: > 1. 一维数组 → 优先用 `array_filter()` > 2. 多维数组 → 使用递归方案 > 3. 需保留 `0` 或 `false` → 自定义回调函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值