web-dev-qa-db-ja.com

forループvs whileループvs foreachループPHP

まず、PHPを初めて使用します。スクリプトでforループ、whileループ、foreachループを使用しています。私は疑問に思う

  • どちらがパフォーマンスに優れていますか?
  • ループを選択する基準は何ですか?
  • 別のループ内でループするときにどちらを使用する必要がありますか?

どちらのループを使用するのか迷っているコード。

for($i=0;$i<count($all);$i++)
{
 //do some tasks here
 for($j=0;$j<count($rows);$j++)
 {
  //do some other tasks here 
 }
}

Whileを使用して上記のコードを記述できることは明らかです。誰かが私にどのループを使用する方が良いかを理解するのを手伝ってくれることを願っています。

19
Techie

どちらがパフォーマンスに優れていますか?

それは問題ではありません。

ループを選択する基準は何ですか?

オブジェクトまたは配列のすべての要素をウォークスルーする必要があるだけの場合は、foreachを使用します。 必要forが含まれるケース

  • たとえば、数値インデックスを使用して明示的に処理を行う必要がある場合:
  • 反復内から前または次の要素を使用する必要がある場合
  • 反復中にカウンターを変更する必要がある場合

foreachは、カウントを設定する必要がなく、オブジェクトプロパティや連想配列要素(forキャッチしません)。通常は、読みやすくするために最適です。

別のループ内でループするときにどちらを使用する必要がありますか?

どちらも問題ありません。デモの場合、foreachが最も簡単な方法です。

34
Pekka 웃

どちらがパフォーマンスに優れていますか?

誰も気にしない?それは重要ではありません。ずっと。このような小さな最適化が重要である場合、PHPは使用しません。

ループを選択する基準は何ですか?

読みやすく、間違いを起こしにくいものを選んでください。整数をループする場合、forループは最適です。配列のようなコレクションをループする場合はforeachが最適です。「完了」するまでループするだけの場合はwhileが最適です。

これは文体のルールにも依存する可能性があります(たとえば、Pythonでは、ほとんどの場合foreachループを使用する必要があるのは、これが「Pythonで行われる方法」であるためです)。標準はPHPですが。

別のループ内でループするときにどちらを使用する必要がありますか?

どちらのループタイプが最も理にかなっています(上記の回答を参照)。

コードでは、開始インデックスと終了インデックスが定義されているので、forループはかなり自然に見えます。

13
Brendan Long

いくつかのPHPベンチマークについての適切なリファレンスについては、 http://www.phpbench.com/ を確認してください。

Forループは通常かなり高速です。 count($ rows)またはcount($ all)をfor自体に含めないでください。次のように外部で実行してください。

$count_all = count($all);
for($i=0;$i<$count_all;$i++)
{
    // Code here
}

Count($ all)をforループに配置すると、ループごとにこのステートメントが計算されます。最初に値を計算し、次に計算をループで使用すると、1回だけ実行されます。

7
Jason
  • パフォーマンスについては、forループとwhileループのどちらを選択しても問題ありません。反復回数によって実行時間が決まります。
  • フォアハンドでの反復回数がわかっている場合は、forループを選択します。ある条件で実行および停止する場合は、whileループを使用します
5
JvdBerg
  • 実行する反復回数が事前にわかっている場合は、forループの方が適しています
  • ループが反対の場合に使用されます(必要な反復回数がわからない場合)
  • For-Eachループは、コレクションを反復処理する必要がある場合に最適です。

私の知る限りでは、whileループとforループのパフォーマンスの違いはほとんどないかまったくないので、for-eachループについてはわかりません

2
yohannes07

パフォーマンス:テストするのに十分簡単です。機械学習やビッグデータなどを実行している場合は、コンパイル済みまたはアセンブル済みであり、interpretedただし;サイクルが本当に重要な場合。 さまざまなプログラミング言語間のベンチマークをいくつか示します。do-whileループは、これらの例でPHPを使用している私のシステムでの勝者です。

$my_var = "some random phrase";

function fortify($my_var){
    for($x=0;isset($my_var[$x]);$x++){
        echo $my_var[$x]." ";
    }
}

function whilst($my_var){
    $x=0;
    while(isset($my_var[$x])){
       echo $my_var[$x]." ";
       $x++;
    }
}

function dowhilst($my_var){
    $x=0;
    do {
       echo $my_var[$x]." ";
       $x++;
    } while(isset($my_var[$x]));
}

function forstream(){
    for($x=0;$x<1000001;$x++){
        //simple reassignment
        $v=$x;
    }
    return "For Count to $v completed";
}

function whilestream(){
    $x=0;
    while($x<1000001){
        $v=$x;
        $x++;
    }
    return "While Count to 1000000 completed";
}

function dowhilestream(){
    $x=0;
    do {
        $v=$x;
        $x++;
    } while ($x<1000001);
    return "Do while Count to 1000000 completed";
}

function dowhilestream2(){
    $x=0;
    do {
        $v=$x;
        $x++;
    } while ($x!=1000001);
    return "Do while Count to 1000000 completed";
}

$array = array(
    //for the first 3, we're adding a space after every character.
        'fortify'=>$my_var,
        'whilst'=>$my_var,
        'dowhilst'=>$my_var,
   //for these we're simply counting to 1,000,000 from 0
   //assigning the value of x to v 
        'forstream'=>'',
        'whilestream'=>'',
        'dowhilestream'=>'',
   //notice how on this one the != operator is slower than
   //the < operator
        'dowhilestream2'=>''
        );

function results($array){
    foreach($array as $function=>$params){


      if(empty($params)){
        $time= microtime();
        $results = call_user_func($function);  
      } elseif(!is_array($params)){
        $time= microtime();  
        $results = call_user_func($function,$params);
      } else {
        $time= microtime();  
        $results = call_user_func_array($function,$params);
      }
      $total = number_format(microtime() - $time,10);
      echo "<fieldset><legend>Result of <em>$function</em></legend>".PHP_EOL;
      if(!empty($results)){
          echo "<pre><code>".PHP_EOL;
          var_dump($results);
          echo PHP_EOL."</code></pre>".PHP_EOL;
      }
      echo "<p>Execution Time: $total</p></fieldset>".PHP_EOL;
    }
}

results($array);

基準:whilefor 、そして foreach は、ほとんどの人がPHPで使用する主要な制御構造です。 do-while は私のテストではwhileよりも高速ですが、ほとんどのPHP Web上のコーディング例ではほとんど使用されていません。

forはカウント制御されるため、特定の回数反復します。私自身の結果では、同じものにwhileを使用するよりも遅いですが。

whileは、何かがfalseで始まる場合に適しているため、何かが実行されたりリソースを浪費したりするのを防ぐことができます。

do-while少なくとも1回、条件がfalseを返すまで。結果のwhileループより少し高速ですが、少なくとも1回は実行されます。

foreachは、arrayまたはobjectを反復するのに適しています。配列構文を使用してforステートメントで文字列をループすることはできますが、PHPではforeachを使用してループを行うことはできません。

制御構造のネスト:これは、使用する制御構造中に決定するために何をしているのかによりますネストするとき。オブジェクト指向プログラミングのようないくつかのケースでは、多くのネストされたコントロールを含む手続き型の大規模なプログラムを使用するのではなく、コントロール構造を含む関数を(個別に)呼び出したい場合があります。これにより、読み取り、デバッグ、インスタンス化が容易になります。

1
AbsoluteƵERØ