array_filter() 是 PHP 過濾陣列元素的核心函數,透過回調函數決定保留哪些元素。**預設移除所有「虛偽值」 (false, 0, "", null, [], 等)**,並**保留關聯鍵名**。本文詳細說明基本用法、多維陣列遞迴過濾、自訂條件、鍵名/鍵值過濾進階技巧。
array_filter(array $array, callable $callback = null, int $flag = 0): array
$callback:回傳 true 保留,false 移除。省略時使用預設規則(移除虛偽值)。$flag:
ARRAY_FILTER_USE_KEY:回調只接收 key。ARRAY_FILTER_USE_BOTH:回調接收 (value, key)。<?php
$array = [
0 => '霜天部落',
1 => false,
2 => 1,
3 => null,
4 => '',
5 => 'https://www.hzhuti.com',
6 => '0', // 字串 "0" 也是虛偽值!
];
$result = array_filter($array);
print_r($result);
/*
Array
(
[0] => 霜天部落
[2] => 1
[5] => https://www.hzhuti.com
)
*/
// 注意:鍵名 0, 2, 5 保留原狀
?>
<?php
// 只保留非空字串且非 "php" 的值
function customFilter($value) {
return $value !== '' && $value !== 'php';
}
$a = ['pig', 'Cat', '', 'php'];
print_r(array_filter($a, 'customFilter'));
/*
Array
(
[0] => pig
[1] => Cat
)
*/
// 匿名函數 (PHP 5.3+)
$filtered = array_filter($a, fn($v) => $v !== '' && $v !== 'php');
?>
<?php
$data = [
'id' => 1,
'name' => 'John',
'password' => 'secret',
'email' => 'john@example.com',
'_token' => 'csrf_token',
];
// 只保留不以下劃線開頭的鍵
$public = array_filter($data, fn($key) => $key[0] !== '_', ARRAY_FILTER_USE_KEY);
/*
[
'id' => 1,
'name' => 'John',
'password' => 'secret', // 注意:鍵名過濾不看值
'email' => 'john@example.com',
]
*/
?>
<?php
$users = [
1 => ['name' => 'Alice', 'active' => true],
2 => ['name' => 'Bob', 'active' => false],
3 => ['name' => 'Charlie', 'active' => true],
];
// 保留 active=true 且 id>1 的用戶
$filtered = array_filter($users, function($user, $id) {
return $user['active'] && $id > 1;
}, ARRAY_FILTER_USE_BOTH);
/*
[
3 => ['name' => 'Charlie', 'active' => true]
]
*/
?>
array_filter() **不會遞迴**進入子陣列。需自行實作:
<?php
function array_filter_recursive(array $array, callable $callback): array {
$result = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
$filtered = array_filter_recursive($value, $callback);
if (!empty($filtered)) { // 子陣列非空才保留
$result[$key] = $filtered;
}
} elseif ($callback($value, $key)) {
$result[$key] = $value;
}
}
return $result;
}
// 測試
$data = [
'a' => 1,
'b' => '',
'c' => [
'd' => 2,
'e' => null,
'f' => [
'g' => 3,
'h' => ''
]
]
];
$clean = array_filter_recursive($data, fn($v) => $v !== '' && $v !== null);
/*
[
'a' => 1,
'c' => [
'd' => 2,
'f' => ['g' => 3]
]
]
*/
?>
'0'。若要保留,必須自訂回調 fn($v) => $v !== '' && $v !== null && $v !== false。array_filter() **保留關聯鍵**,但**數字鍵會重新索引 (0,1,2...)**。若需保留數字鍵,需先轉關聯鍵或用 array_values() 後再處理。===/!== 避免型別轉換驚喜。<?php
function cleanInput(array $input): array {
return array_filter($input, function($value, $key) {
// 移除空字串、純空白、特定標記
if (is_string($value)) {
$trimmed = trim($value);
if ($trimmed === '' || $trimmed === 'N/A') return false;
}
// 移除內部欄位
if (str_starts_with($key, '_')) return false;
return true;
}, ARRAY_FILTER_USE_BOTH);
}
$_POST = cleanInput($_POST);
// 後續處理乾淨的 $_POST
?>