在日常使用Laravel 開發的過程中,我們經常會遇到需要清理數組中“無效”數據的場景。比如表單中未填寫的字段、API 參數中為空的值,或者需要根據某些邏輯來篩選數據項。而在PHP 中, array_filter()就是一把處理這些問題的利器。
雖然array_filter()是一個原生的PHP 函數,但它在Laravel 項目中同樣有非常廣泛的應用場景。接下來,我們就通過幾個真實的例子,一步步帶你掌握如何在Laravel 項目中優雅地使用它。
一個最常見的場景是用戶提交了一個表單,但部分字段為空。我們希望只處理非空字段。
$data = [
'name' => 'Alice',
'email' => '',
'phone' => null,
'age' => 25,
];
// 使用 array_filter 過濾空值(默認會移除 false、null、''、0)
$filtered = array_filter($data);
dd($filtered);
輸出:
[
'name' => 'Alice',
'age' => 25,
]
在Laravel 中,這種處理常用於控制器中接收請求數據後清洗:
public function store(Request $request)
{
$data = array_filter($request->only(['name', 'email', 'phone', 'age']));
// 接下來的邏輯只處理非空字段
User::create($data);
return redirect()->to('https://m66.net/success');
}
默認的array_filter()會移除所有“假值”,包括數字0 和字符串"0"。如果你只想移除空字符串而保留有效的0,該怎麼辦?
$data = [
'status' => 0,
'code' => '0',
'description' => '',
];
// 自定義回調,僅過濾空字符串
$filtered = array_filter($data, function ($value) {
return $value !== '';
});
輸出:
[
'status' => 0,
'code' => '0',
]
這種寫法在處理訂單狀態、價格區間等邏輯中非常實用,避免誤刪有效的“0”。
Laravel 的Collection 也提供了類似的filter()方法,與array_filter()類似,但更加強大。比如我們可以鍊式操作:
$users = collect([
['name' => 'Tom', 'email' => 'tom@m66.net'],
['name' => 'Jerry', 'email' => null],
['name' => 'Spike', 'email' => ''],
]);
$filtered = $users->filter(function ($user) {
return !empty($user['email']);
});
也可以直接使用filter()簡化邏輯:
$filtered = $users->filter(fn($user) => !empty($user['email']));
輸出:
[
['name' => 'Tom', 'email' => 'tom@m66.net'],
]
假設你在開發一個用戶搜索功能,前端傳遞了一些可選參數,你只想構建包含非空條件的查詢:
public function index(Request $request)
{
$filters = array_filter($request->only(['name', 'email', 'status']), function ($val) {
return $val !== '';
});
$users = User::where($filters)->get();
return view('users.index', compact('users'));
}
這樣你就能根據實際輸入,靈活構建查詢條件,避免出現where('', '')這樣的無效查詢。
array_filter()是一個簡單但非常強大的工具,配合Laravel 的Request 和Collection 使用時,可以極大提升數據清洗的效率與代碼可讀性。
如果你還沒有在項目中用過array_filter() ,不妨現在就試試,讓它成為你寫Laravel 時的好幫手!