在PHP 開發中,數組操作是日常工作中最常見的一環。而“清洗數組”這件事,我們幾乎天天都在做。無論是處理用戶提交的表單數據,還是清理接口返回的數據,其中最常見的需求之一就是。
幸運的是,PHP 提供了一個非常優雅的方法: array_filter() 。本文將帶你深入了解這個函數的用法,並分享一些實用技巧,幫你高效、靈活地過濾數組中的空元素。
PHP 的array_filter()默認行為就是移除數組中值為“false”的元素,包括:
空字符串''
數字0 和字符串'0'
null
false
空數組[]
來看一個最簡單的例子:
$data = ['apple', '', null, 'banana', 0, '0', false];
$filtered = array_filter($data);
print_r($filtered);
輸出結果為:
Array
(
[0] => apple
[3] => banana
)
你會發現, array_filter()默認就把那些“看上去沒內容”的值都去掉了。這種用法對於大多數場景已經足夠好。
如果你不希望'0'或0被過濾掉,那就可以自定義一個回調函數,讓array_filter()只過濾掉你真正認為是“空”的值,比如null或'' 。
$data = ['title' => '', 'price' => 0, 'available' => false, 'sku' => '0', 'description' => null];
$filtered = array_filter($data, function($value) {
return !is_null($value) && $value !== '';
});
print_r($filtered);
輸出:
Array
(
[price] => 0
[available] =>
[sku] => 0
)
這種方式特別適合處理用戶表單數據或配置項,不會誤刪有意義的“零值”。
假設你要將用戶輸入的數據通過POST 請求發送給某個API,我們不希望把空值傳過去:
$formData = [
'name' => '張三',
'email' => '',
'phone' => null,
'age' => 25
];
$cleanData = array_filter($formData, function($val) {
return !is_null($val) && $val !== '';
});
$apiUrl = 'https://api.m66.net/user/submit';
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($cleanData),
]
];
$context = stream_context_create($options);
$result = file_get_contents($apiUrl, false, $context);
echo $result;
通過這種方式,我們只發送有效數據,避免讓API 收到一堆沒用的字段。
如果你的數組是多維的,比如從前端提交的嵌套表單,那就需要用遞歸的方式去清理:
function recursive_filter(array $input) {
foreach ($input as $key => &$value) {
if (is_array($value)) {
$value = recursive_filter($value);
}
}
return array_filter($input, function($val) {
return $val !== '' && !is_null($val);
});
}
$data = [
'user' => [
'name' => '李四',
'email' => '',
'tags' => ['', null, 'developer']
],
'status' => null
];
$cleaned = recursive_filter($data);
print_r($cleaned);
這樣處理後,你的數組幹乾淨淨,既不會漏刪空值,也不會錯刪有效內容。
通過上面的案例,我們可以看到:
array_filter()默認行為已經很強大,快速去掉各種“假值”。
搭配自定義回調,你可以精確控制要過濾的內容。
處理複雜結構時,用遞歸方式也能輕鬆應對。
實際開發中,它可以用於清理表單數據、接口請求參數、甚至數據庫寫入前的數據過濾。
總之,這個函數用得越熟練,你的數據就越乾淨,代碼也會更優雅!
相關標籤:
array_filter