Laravel 的 foreach
和 forelse
之间的基本区别是什么? 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 可能为您捕获的检查。
<小时/>引用链接:
关于laravel - Laravel 中 foreach 和 forelse 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47979448/