2012-10-11 17 views
13

第1オフ私はPHPが初めてです。私はforループ、whileループ、foreachループをスクリプトで使用しています。私は不思議ですforループ対whileループ対foreachループPHP

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

どのループを使用するのか不思議に思っているコードです。

whileを使用して上記のコードを書くことができます。誰かが私を助けて、どのループを使うべきかを理解することを願っています。

+7

パフォーマンスに関しては関係ありません。 –

+4

文法的に、インクリメンタルな 'for'ループは、PHPで配列を反復するのにはめったに使われません。ループ内で配列キーと値の両方を供給することができるので、代わりに 'foreach'が使われます。 –

答えて

23

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

問題ではありません。

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

オブジェクトまたは配列のすべての要素を調べるだけであれば、foreachを使用してください。

  • あなたが反復
  • とき内から前または次の要素を使用する必要がある場合:あなたが明示的に例えば、数値インデックスで物事を行う必要があるとき必要for

    • が含まれるケースそれはカウントを設定する必要はありませんので、はるかに便利で、かつ任意のKIを通して方法を働かせることができる反復

    foreach中にカウンタを変更する必要がありますnd of member - それはオブジェクトプロパティか連想配列要素(forは捕捉できません)です。通常は読みやすくするために最適です。

    これは、別のループ内でループするときに使用する必要がありますか?

    どちらも問題ありません。あなたのデモのケースでは、foreachが最も簡単な方法です。

  • +0

    通常の配列を持つ 'for'ループは、' foreach'繰り返しよりも(妙に)少し速いですが、それはそれを使う良い理由ではありません。読みにくいですし、通常の配列の代わりにTraversableを置き換えることはできません。 –

    +1

    @フランシスええ。さらに、10k要素で実行しても、パフォーマンスの差は*マイクロ秒*です(JasonのPHPBenchリンクを参照)。違いは本当に意味がありません。 –

    +2

    まあ、foreachループは実際には変数をメモリにコピーしてそれを繰り返します。つまり、forループで元の変数を直接反復しているからです。あなたが何百万という要素を扱っていない限り、ほんのわずかな違いです。 +1すばらしい答えtho:P –

    10

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

    誰が気にしますか?それは重要ではありません。これまでこのような小さな最適化が重要なのであれば、PHPを使用することはできません。

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

    将来は間違いを起こす可能性が最も低く、読みやすいものを選んでください。整数をループするときは、forループが素晴らしいです。配列のようなコレクションをループするときは、foreachが素晴らしいです。ループする必要があるときは、完了するまでwhileは素晴らしいです。

    これは文法的なルールにも依存します(例えば、Pythonではほとんどの場合foreachループを使用します。これは「Pythonでのやり方」です)。私はPHPの標準が何であるか分かりません。

    これは、別のループ内でループするときに使用する必要がありますか?

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

    コードでは、定義された開始インデックスと停止インデックスがあるため、forループはかなり自然なようです。パフォーマンスのために

    5
    • あなたがforwhileループを選択した場合、反復回数が実行時間を決定する問題ではありません。
    • フォアハンドで反復回数を知っている場合は、forループを選択してください。あなたが実行した状態で停止したい場合は、いくつかのPHPベンチマークの良い参考のためwhileループ
    7

    チェックhttp://www.phpbench.com/を使用しています。

    forループは通常かなり高速です。 、自分自身のためにあなたのカウント($行)またはカウント($すべて)を含みそうのような外部のそれをしないでください:forループでのカウント($すべてを)置く

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

    が、それはこの文を計算します各ループごとに。最初に値を計算してから、ループ内の計算を使用すると、1回だけ実行されます。あなたは(あなたが 反復が必要とされているどのように多くのか分からないとき)ループが逆の場合に使用されているが、多くの 反復が

  • を実行する方法を事前に知っていたときに、forループ

  • +2

    両方の点であなたに同意しません。ベンチマークは本当に重要ではありません - 実際の世界の違いはPHPスクリプトで200マイクロ秒ですか?誰もいません。表示するコードを見て、それを 'foreach($ all)'と比較してください。読みやすく保守しやすいのはどちらですか? –

    +0

    私は同意します、そしてforeachも読むのがはるかにいいです。 forループは、キーへのすべての参照で混乱することがあります。 – DevNinjaJeremy

    2
    • がより適切ですFor-Eachループは、コレクションを反復処理する必要があるときに最適です。私の知る限り

    私は、各ループ

    0

    パフォーマンスを知らないループとループのためしばらくの間、無パフォーマンスの違いに少しあります: 簡単に十分なテストする。機械学習や大きなデータのようなものをやっているのであれば、またはと組み立てられたがあり、が解釈されていないものがあります。と解釈してください。サイクルがの場合、実際にはとなります。 Here are some benchmarks between the various programming languages.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よりも高速ですが、Web上のほとんどのPHPコーディング例ではほとんど使われていません。

    forはカウント制御されているため、特定の回数だけ繰り返します。同じことについてはwhileを使用するよりも自分の結果が遅くなります。

    whileは、何かがfalseとして始まる可能性がある場合に適しているため、何かが実行されてリソースが無駄になることを防ぐことができます。

    do-while少なくとも1回、その後条件がfalseになるまで。私の結果ではwhileループより少し速いですが、少なくとも1回は実行されます。

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

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

    関連する問題