巧用php中的array_filter()函数去掉多维空值的代码分享


在PHP中,`array_filter()` 函数是一个非常有用的工具,它允许你通过自定义的回调函数来过滤数组中的元素。然而,对于多维数组,`array_filter()` 默认情况下只处理一维数组。为了处理多维数组并去除其中的空值(包括空字符串、`null`、`0`、`'0'` 等,根据需求可能需要调整),我们需要递归地应用 `array_filter()`。

下面是一个示例代码,它展示了如何递归地过滤多维数组中的空值:


function filterArray($array) {
    return array_filter($array, function ($value) use (&$filterArray) {
        if (is_array($value)) {
            // 如果当前元素是数组,则递归过滤
            return !empty(filterArray($value));
        }
        // 对于非数组元素,直接检查是否为空
        return ($value !== null && $value !== '' && $value !== 0 && $value !== '0');
    });
}

// 示例多维数组
$multiDimensionalArray = [
    'key1' => 'value1',
    'key2' => null,
    'key3' => [
        'subKey1' => 'subValue1',
        'subKey2' => '',
        'subKey3' => [
            'deepSubKey1' => 0,
            'deepSubKey2' => 'deepSubValue2'
        ]
    ],
    'key4' => '0'
];

// 应用过滤函数
$filteredArray = filterArray($multiDimensionalArray);

// 打印结果以验证
echo '<pre>';
print_r($filteredArray);
echo '</pre>';

注意:

- 在这个示例中,我使用了 `is_array()` 来检查元素是否为数组,并递归地调用 `filterArray()` 函数。

- 对于非数组元素,我使用了 `!==` 来确保 `null`、空字符串 `''`、数字 `0` 和字符串 `'0'` 都被视为“空”并被过滤掉。但请注意,这可能不符合所有情况的需求,因为 `0` 和 `'0'` 在某些情况下可能是有效的数据。根据实际需求,你可能需要调整这部分逻辑。

- 我还使用了 `&` 符号将 `filterArray` 函数作为引用传递给回调函数,这是因为在PHP中递归调用函数时,如果不使用引用,可能会导致函数定义被反复加载到内存中,从而增加内存消耗。然而,在这个特定的例子中,由于 `filterArray` 已经在全局作用域中定义,所以实际上并不需要这样做。但为了保持示例的通用性,我还是加上了引用传递。在大多数实际场景中,你可以省略这个引用传递。