在 Laravel 中排除数组中元素的最佳实践:控制器还是 Twig?
2024-03-11 01:57:19
在 Laravel 中过滤数组以排除另一个数组中的元素
问题
假设您有一个包含所有用户列表的数组 $users
,以及另一个包含参与评估的用户列表的数组 $evals
。您需要创建一个第三个数组,其中仅包含不在 $evals
中的用户。
解决方案
控制器中过滤
在控制器中,您可以使用 array_diff()
函数过滤数组:
$excludedUsers = array_diff($users, $evals);
此代码会创建一个名为 $excludedUsers
的新数组,其中包含在 $users
中但不在 $evals
中的用户。
Twig 中过滤
在 Twig 中,您可以使用 reject
过滤器过滤数组:
{% set excludedUsers = users|reject(evals) %}
此代码会创建一个名为 excludedUsers
的新变量,其中包含在 users
中但不在 evals
中的用户。
最佳实践
在控制器中执行过滤更有效,因为它可以在请求处理阶段尽早完成。但是,在 Twig 中过滤对于呈现目的可能更方便。
示例
控制器:
public function showUsers()
{
$evals = $this
->getDoctrine()
->getRepository(User::class)
->findUserGroups();
$users = $this
->getDoctrine()
->getRepository(User::class)
->findAll();
$excludedUsers = array_diff($users, $evals);
// 在视图中显示 $excludedUsers
return $this->render('users/show.html.twig', [
'excludedUsers' => $excludedUsers,
]);
}
Twig:
{% set evals = ... %}
{% set users = ... %}
<select name="user">
{% for user in users|reject(evals) %}
<option value="{{ user.idUser }}" label="{{ user.name }} ">
{% endfor %}
</select>
常见问题解答
-
为什么在控制器中过滤更有效?
因为控制器在请求处理的早期执行过滤,避免了将不必要的数据传递到视图。 -
是否可以在过滤器中使用多个条件?
是的,可以使用reject(criteria1, criteria2, ...)
语法在过滤器中指定多个条件。 -
如果
$users
和$evals
中有重复元素怎么办?
array_diff()
和reject
过滤器都会自动删除重复元素。 -
是否可以对过滤后的数组进行其他操作?
是的,您可以使用array_map()
,array_reduce()
,array_filter()
等函数进一步处理过滤后的数组。 -
是否有其他方法可以过滤数组?
除了array_diff()
和reject
之外,您还可以使用array_diff_assoc()
,array_unique()
和array_filter()
等函数过滤数组。