在日常使用 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 时的好帮手!
相关标签:
array_filter