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

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

最佳答案

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

从Blade Templates上的Laravel 5文档中,可以看到一个示例,其中两个循环的用户列表与Input相同:

@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框架的源代码进行比较,以查看循环的编译方式(当网页上的PHP渲染所有Blades构造时,会将所有Blades构造都编译为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可能为您捕获的空检查。



参考链接:


Blade Templates
Blade View Compile Functions

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

10-10 16:47