empty($arr):陣列含空字串 ["", "", ""] 仍回傳 false(非空)。count($arr):同上,計算元素個數非內容是否為空。in_array('', $arr):僅檢測「是否存在空值」,無法判定整個陣列是否全空。implode():二維陣列 [[], [], []] 會產生 ",," 導致誤判為非空。$arr = ['a', '', 'b', null, 0, false, 'c', ''];
// 1. 刪除所有「空值」(''、null、false、0、'0'、[])
$filtered = array_filter($arr);
// 結果:['a', 'b', 'c'] — 0 和 false 也被移除
// 2. 僅刪除空字串,保留 0/false
$filtered = array_filter($arr, function($v) { return $v !== ''; });
// 結果:['a', 'b', null, 0, false, 'c']
// 3. 刪除指定值(如 'b')
$filtered = array_diff($arr, ['b', '']);
// 結果:['a', null, 0, false, 'c'] — 保留鍵名不重排
// 4. 刪除指定值並重排索引
$filtered = array_values(array_diff($arr, ['b', '']));
// 結果:['a', null, 0, false, 'c'] (索引 0..4)
function array_clean_recursive(array $array, callable $callback = null): array {
$callback ??= fn($v) => $v !== '' && $v !== null; // 預設刪除空字串與 null
foreach ($array as $key => &$value) {
if (is_array($value)) {
$value = array_clean_recursive($value, $callback);
// 可選:清理後若子陣列為空,一併移除
if (empty($value)) {
unset($array[$key]);
}
} elseif (!$callback($value)) {
unset($array[$key]);
}
}
return $array;
}
// 使用範例
$data = [
'users' => [
['name' => 'Tom', 'email' => ''],
['name' => '', 'email' => 'jerry@example.com'],
['name' => '', 'email' => ''],
],
'meta' => ['source' => '', 'tags' => []]
];
$clean = array_clean_recursive($data);
// 結果:users 保留前兩筆(第三筆全空被移除),meta 保留 tags 空陣列(未觸發移除條件)
$arr = ['id' => 1, 'name' => 'Tom', 'password' => 'secret', 'token' => 'abc'];
// 刪除敏感鍵
unset($arr['password'], $arr['token']);
// 或
$safe = array_diff_key($arr, array_flip(['password', 'token']));
array_filter() 會保留原鍵名,大陣列建議搭配 array_values() 重排或直接 foreach 就地修改(引用 &$v)。掌握 array_filter、array_diff、遞迴清理三大核心工具,靈活應對各類陣列淨化需求。