2017-12-26 37 views
1

Laravelのforeachforelseの基本的な違いは何ですか? forelseはどのように機能しますか?Laravelのforeachとforelseの違い

foreach私は、forelseの中にある配列が存在するかどうかをチェックしていますが、それが存在すればループしていますが、それ以外の場合はelse条件を使用しています。

答えて

1

あなたの質問に対する答えは、本質的にForElse です。ForEachループですが、空の入力を余分に処理します。ブレイドテンプレート、入力としてユーザーの同じリストで両方のループを示す一例で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フレームワークのソースコードにこれを比較する場合ループがコンパイルされているかを確認する(Webページ上の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
+0

感謝をforelseのthnxの機能についての詳細情報が必要 –

0

foreachループあなたはarrayの各要素をループを説明するように、あなたはすでに、else文を気づいたように、本質的にforeseeループは1つの余分な要素と全く同じです。 arrayが空のときにこれを使用する主な用途。

したがって、すべての要素をループして、たとえばテーブルの行をレンダリングしますが、データがないときは空の通知を入れます。

+0

返事を私は探しています何の説明のための –

関連する問題