在PHP开发中,动态构建多维数组并过滤其中的空值条目是常见需求,比如处理表单提交的嵌套数据、接口返回的多层结构数据时,都需要先构建数组再清洗无效内容。下面我们来一步步实现这个需求。

动态构建多维子数组
动态构建多维数组通常需要根据不同的条件往指定层级添加元素,我们可以通过引用传递的方式操作数组,避免反复赋值。以下是一个简单的构建示例,模拟根据分类动态添加商品信息到多维数组:
<?php
// 初始化空的多维数组
$data = [];
// 模拟要添加的商品数据
$items = [
['category' => 'book', 'name' => 'PHP入门教程', 'price' => 59],
['category' => 'book', 'name' => '', 'price' => 0], // 空名称的商品
['category' => 'electronics', 'name' => '鼠标', 'price' => 89],
['category' => 'electronics', 'name' => '键盘', 'price' => null], // 价格为null的商品
['category' => 'book', 'name' => 'MySQL实战', 'price' => 79],
];
// 动态构建多维数组,按category分组
foreach ($items as $item) {
$category = $item['category'];
// 如果分类不存在则初始化空数组
if (!isset($data[$category])) {
$data[$category] = [];
}
// 将商品添加到对应分类下
$data[$category][] = $item;
}
// 打印构建后的数组
print_r($data);
?>
过滤多维数组中的空值条目
构建完成后,我们需要过滤掉子数组中的空值条目,这里的空值包括空字符串、null、空数组、0等不符合业务要求的值。PHP内置的array_filter函数可以过滤数组中的空值,但默认只处理一维数组,对于多维数组需要递归处理。
自定义递归过滤函数
我们可以封装一个递归函数,遍历多维数组的每一个层级,对子数组条目进行过滤:
<?php
/**
* 递归过滤多维数组中的空值条目
* @param array $array 待过滤的多维数组
* @return array 过滤后的数组
*/
function filter_multi_array(array $array): array {
foreach ($array as $key => $value) {
// 如果当前值是数组,递归处理
if (is_array($value)) {
$array[$key] = filter_multi_array($value);
// 如果过滤后的子数组为空,也移除该键
if (empty($array[$key])) {
unset($array[$key]);
}
} else {
// 判断当前值是否为空,根据业务需求调整空值判断逻辑
// 这里排除0和false,只过滤空字符串、null、空数组等
if ($value === '' || $value === null || $value === []) {
unset($array[$key]);
}
}
}
return $array;
}
// 使用之前构建的$data数组进行测试
$filteredData = filter_multi_array($data);
print_r($filteredData);
?>
结合array_filter优化过滤逻辑
如果只需要过滤最外层的子数组,或者明确知道数组的层级结构,也可以结合array_filter和自定义回调实现,效率会更高:
<?php
// 过滤多维数组的第一层子数组,移除子数组全为空的条目
$filteredData = array_filter($data, function ($subArray) {
// 如果子数组不是数组,直接判断是否为空
if (!is_array($subArray)) {
return !empty($subArray);
}
// 过滤子数组内部的空值
$filteredSub = array_filter($subArray, function ($item) {
// 判断子数组中的单个条目是否为空
if (is_array($item)) {
return !empty($item);
}
return $item !== '' && $item !== null;
});
// 如果过滤后的子数组不为空,则保留该分类
return !empty($filteredSub);
});
print_r($filteredData);
?>
注意事项
- 空值的定义需要根据业务场景调整,比如有些场景0是有效值,有些场景0需要被过滤,修改判断条件即可。
- 递归过滤函数会遍历所有层级,如果数组层级非常深或者数据量很大,需要注意性能问题,可以适当增加终止条件。
- 使用
unset之后,数组的键可能不会重新排列,如果需要连续的键,可以在过滤后使用array_values重置键名。
处理多维数组时,优先使用PHP内置的数组函数,避免手写过多嵌套循环,既能减少代码量,也能降低出错概率。
PHP多维数组数组过滤array_filter修改时间:2026-07-13 23:54:23