Laravel中foreach和forelse之间的区别

时间:2017-12-26 13:42:36

标签: laravel loops laravel-5

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

我知道foreach复制你给定的数组并在其上工作,而在forelse它会检查它是否存在并在其上循环(如果它存在但是如果不存在则使用你提供的其他条件。) p>

3 个答案:

答案 0 :(得分:12)

我相信你的问题的答案是,基本上,ForElse 一个ForEach循环,但是对空输入有额外的处理。

从Blade模板上的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循环有一个内置代码和一个空输入的编译检查,在这种情况下,它可选择为空输入输出一个备用显示模板。

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

参考链接:

  1. Blade Templates
  2. Blade View Compile Functions

答案 1 :(得分:2)

你描述的foreach循环遍历array中的每个元素,foresee循环本质上与你已经注意到的一个额外元素完全相同,{{ 1}}陈述。当您有空else时,可以使用此主要用途。

因此循环遍历所有元素,例如渲染表的一行,但在没有任何数据时发出空通知。

答案 2 :(得分:2)

查看基本区别是在找不到数据的情况下 path循环中,您必须检查foreach条件,然后根据输出进行打印。这会增加一点点工作量,但是在count中它会自动检查并使用forelse时,您@empty找不到数据。

相关问题