laravel - Laravel 中 foreach 和 forelse 的区别

标签 laravel loops laravel-5

Laravel 的 foreachforelse 之间的基本区别是什么? forelse 是如何工作的?

我知道 foreach 会复制您给定的数组并对其进行处理,而在 forelse 中它会检查它是否存在并在其上循环(如果存在),但如果不存在,则使用您的提供其他条件。

最佳答案

我相信您问题的答案是,本质上,ForElse 一个 ForEach 循环,但对空数组进行了额外的处理。

来自 Blade Templates 上的 Laravel 5 文档,这是一个示例,说明了具有相同用户列表作为输入的两个循环:

@foreach ($users as $user)
    <p>This is user {{ $user->id }}</p>
@endforeach

@forelse ($users as $user)
    <li>{{ $user->name }}</li>
@empty
    <p>No users</p>
@endforelse
<小时/>

现在,如果我们将其与 Laravel 框架的源代码进行比较,看看循环是如何编译的(所有 Blades 结构在由 PHP 在网页上渲染时都会编译为 HTML):

   /**
     * Compile the for-each statements into valid PHP.
     *
     * @param  string  $expression
     * @return string
     */
    protected function compileForeach($expression)
    {
        preg_match('/\( *(.*) +as *(.*)\)$/is', $expression, $matches);

        $iteratee = trim($matches[1]);

        $iteration = trim($matches[2]);

        $initLoop = "\$__currentLoopData = {$iteratee}; \$__env->addLoop(\$__currentLoopData);";

        $iterateLoop = '$__env->incrementLoopIndices(); $loop = $__env->getLastLoop();';

        return "<?php {$initLoop} foreach(\$__currentLoopData as {$iteration}): {$iterateLoop} ?>";
    }


   /**
     * Compile the for-else statements into valid PHP.
     *
     * @param  string  $expression
     * @return string
     */
    protected function compileForelse($expression)
    {
        $empty = '$__empty_'.++$this->forElseCounter;

        preg_match('/\( *(.*) +as *(.*)\)$/is', $expression, $matches);

        $iteratee = trim($matches[1]);

        $iteration = trim($matches[2]);

        $initLoop = "\$__currentLoopData = {$iteratee}; \$__env->addLoop(\$__currentLoopData);";

        $iterateLoop = '$__env->incrementLoopIndices(); $loop = $__env->getLastLoop();';

        return "<?php {$empty} = true; {$initLoop} foreach(\$__currentLoopData as {$iteration}): {$iterateLoop} {$empty} = false; ?>";
    }
<小时/>

本质上,ForElse 循环具有内置代码并针对空输入进行编译检查,在这种情况下,它可以选择为空输入输出备用显示模板。

我想您可以在可能使用 ForElse 循环的每种情况下使用 ForEach 循环,并添加您包含并清空 ForElse 可能为您捕获的检查。

<小时/>

引用链接:

  1. Blade Templates
  2. Blade View Compile Functions

关于laravel - Laravel 中 foreach 和 forelse 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47979448/

相关文章:

php - 未捕获的 ReflectionException : Class log does not exist in/vendor/laravel/framework/src/Illuminate/Container/Container. php:738

laravel-5 - Laravel 5.5 测试 JSON header 不起作用

php - Laravel:如何在没有数据库的情况下对用户进行身份验证

javascript - 使用 Array.from( Array(n) ).map(String) 的 24 小时下拉菜单

javascript - 比较 2 个数组并替换匹配的键中的值?

javascript - 循环内的切换脚本仅适用于第一次迭代

php - Laravel Controller 中未找到请求错误

php - 或者在带有子查询的 Laravel 查询生成器中的 WHERE IN

laravel - 如果我在 laravel 上使用许多 "get",我该如何实现资源 Controller ?

php - Laravel 在生产中以编程方式从 web.php 调用 artisan 命令