返回

在 Laravel 中排除数组中元素的最佳实践:控制器还是 Twig?

php

在 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>

常见问题解答

  1. 为什么在控制器中过滤更有效?
    因为控制器在请求处理的早期执行过滤,避免了将不必要的数据传递到视图。

  2. 是否可以在过滤器中使用多个条件?
    是的,可以使用 reject(criteria1, criteria2, ...) 语法在过滤器中指定多个条件。

  3. 如果 $users$evals 中有重复元素怎么办?
    array_diff()reject 过滤器都会自动删除重复元素。

  4. 是否可以对过滤后的数组进行其他操作?
    是的,您可以使用 array_map(), array_reduce(), array_filter() 等函数进一步处理过滤后的数组。

  5. 是否有其他方法可以过滤数组?
    除了 array_diff()reject 之外,您还可以使用 array_diff_assoc(), array_unique()array_filter() 等函数过滤数组。