22

最初に私は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を使用して上記のコードを記述できることは明らかです。誰かが私がどのループを使用するのが良いかを理解するのを手伝ってくれることを願っています。

4

6 に答える 6

34

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

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

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

オブジェクトまたは配列のすべての要素をウォークスルーする必要がある場合は、を使用しますforeach必要な場合 は次のforとおりです

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

foreachforカウントを設定する必要がなく、オブジェクトのプロパティや連想配列要素(キャッチされない)など、あらゆる種類のメンバーを処理できるため、はるかに便利です。通常、読みやすさのために最適です。

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

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

于 2012-10-11T20:00:56.483 に答える
16

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

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

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

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

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

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

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

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

于 2012-10-11T20:01:15.343 に答える
7

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

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

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

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

于 2012-10-11T20:01:43.373 に答える
6
  • forパフォーマンスのために、ループを選択するかループを選択するかは重要ではありませんwhile。反復回数によって実行時間が決まります。
  • フォアハンドでの反復回数がわかっている場合は、forループを選択します。ある条件で実行および停止する場合は、whileループを使用します
于 2012-10-11T20:01:27.913 に答える
2
  • 実行する反復回数が事前にわかっている場合は、forループの方が適切です。
  • 逆の場合(必要な反復回数がわからない場合)にwhileループが使用されます
  • For-Eachループは、コレクションを反復処理する必要がある場合に最適です。

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

于 2012-10-11T20:03:56.297 に答える
2

パフォーマンス: テストするのに十分簡単です。機械学習やビッグデータのようなことをしている場合は、コンパイルまたはアセンブルされ、解釈されていないあります。サイクルが本当に重要な場合。さまざまなプログラミング言語間のベンチマークを次に示します。これらの例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);

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

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

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

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

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

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

于 2017-09-17T22:05:09.963 に答える