<?php
$arr = ['', 'keep', '', 0, 'also keep', null, false, 'last'];
print_r(array_filter($arr));
/*
Array
(
[1] => keep
[4] => also keep
[7] => last
)
*/
// 預設回呼:移除「轉換為 false 的值」:'', 0, '0', null, false, []
array_filter **不會重新索引數值鍵**,保留原鍵名。若需連續索引,後接 array_values()。
<?php
$arr = ['a', '', 'b'];
$filtered = array_filter($arr); // [0 => 'a', 2 => 'b']
$reindexed = array_values($filtered); // [0 => 'a', 1 => 'b']
<?php
$arr = ['', 0, '0', ' ', 'hello', null, false, []];
// 1. 僅移除 null 和 '' (保留 0, '0', false, ' ')
$r1 = array_filter($arr, fn($v) => $v !== '' && $v !== null);
// [0, '0', ' ', 'hello', false, []]
// 2. 移除所有「空白字串」 (含空格、Tab)
$r2 = array_filter($arr, fn($v) => !is_string($v) || trim($v) !== '');
// [0, '0', 'hello', false, []]
// 3. 遞迴清理多維陣列
function array_filter_recursive(array $array, callable $callback = null): array {
$callback ??= fn($v) => $v !== '' && $v !== null;
$result = [];
foreach ($array as $k => $v) {
if (is_array($v)) {
$cleaned = array_filter_recursive($v, $callback);
if ($cleaned !== []) $result[$k] = $cleaned; // 移除空子陣列
} elseif ($callback($v)) {
$result[$k] = $v;
}
}
return $result;
}
$data = [
'user' => ['name' => 'John', 'nick' => '', 'tags' => ['php', '', 'laravel']],
'meta' => ['ip' => '', 'ua' => 'mozilla'],
'empty' => []
];
print_r(array_filter_recursive($data));
/*
Array
(
[user] => Array
(
[name] => John
[tags] => Array
(
[0] => php
[2] => laravel
)
)
[meta] => Array
(
[ua] => mozilla
)
)
*/
?>
| 方法 | 時間 (ms) | 記憶體 (MB) | 說明 |
|---|---|---|---|
array_filter($arr) | 45 | 16 | 內建 C 實作,最快 |
array_filter($arr, fn($v)=>$v!=='') | 62 | 18 | 使用者回呼有函數呼叫開銷 |
foreach + 新陣列 | 38 | 14 | 手寫迴圈最省記憶體,但可讀性較差 |
array_diff($arr, ['']) | 120 | 32 | 內部排序比較,極慢,不推薦 |
array_filter 保留**字串鍵名**,但若原陣列為純數值索引且經過過濾後鍵名不連續,json_encode 會輸出物件而非陣列。解決:array_values(array_filter(...))。
物件轉布林永遠為 true (除非類別實作 __toString 回傳空字串)。需自訂回呼:fn($obj) => $obj->isValid()。
使用上方 array_filter_recursive() 或 array_walk_recursive 配合引用修改 (較複雜)。
array_filter($arr, fn($v) => $v !== '' && $v !== null) 而非依賴預設鬆散轉型。foreach 就地修改 (引用 &$v) 避免複製記憶體,或分批處理。array_filter → array_map → array_values 鏈式處理,最後統一重新索引。0, '0', false, [], new stdClass() 皆為「非空」或「空」視業務而定,務必寫單元測試。