PHP过滤二维数组 移除所有行对应值全为空的列
PHP多维数组全空键过滤方案
你之前使用的$table_row_array = array_filter(array_map('array_filter', $table_row_array));逻辑存在本质问题:
- 该写法是对每一行子数组单独做过滤,只要当前行里某个值为空就会删掉对应键,完全没有判断「这个键是否在所有行中都为空」,最终必然出现不同行键不匹配、缺列的问题。
正确实现分两步即可:
- 先统计有效列:遍历所有行,只要某一列在任意一行存在非空值,就标记为需要保留的列;只有所有行该列值都为空时,才将该列纳入删除范围。
- 逐行重构数组:每一行只保留上一步统计出的有效列,保证所有行的键名完全统一。
可直接使用的代码如下:
// 原始表格数据数组 $table_row_array = [ [ 'Standort' => '', 'Letzte Meldung' => '', 'On-/Offline seit' => '04.05.2022 11:03', 'Online' => '', ], [ 'Standort' => 'Schweiz', 'Letzte Meldung' => '', 'On-/Offline seit' => '11.02.2022 14:59', 'Online' => '', ] ]; // 统计所有存在非空值的有效列 $validColumns = []; foreach ($table_row_array as $row) { foreach ($row as $key => $value) { // 匹配非空字符串即标记为有效列,可根据自身空值判定规则调整条件 if ($value !== '') { $validColumns[$key] = true; } } } $validColumns = array_keys($validColumns); // 逐行提取有效列数据 $result = []; foreach ($table_row_array as $row) { $temp = []; foreach ($validColumns as $colKey) { $temp[$colKey] = $row[$colKey]; } $result[] = $temp; }
运行后得到的结果和预期完全一致:
array ( 0 => array ( 'Standort' => '', 'On-/Offline seit' => '04.05.2022 11:03', ), 1 => array ( 'Standort' => 'Schweiz', 'On-/Offline seit' => '11.02.2022 14:59', ), )
注意事项:
- 示例中空值判定用的是
$value !== ''严格匹配空字符串,如果业务中需要将null、布尔false、数字0也判定为需过滤的空值,可以将判断条件替换为if (!empty($value))。处理表格类数据时优先用严格匹配,避免把合法的0值、空字符串标记的默认值列误删。 - 该方案基于你提到的「所有子数组键名完全一致」的前提实现,不会出现行结构不统一、缺键的问题。
内容的提问来源于stack exchange,提问作者user2226872
相关产品推荐
相关产品推荐

