まず、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を使用して上記のコードを記述できることは明らかです。誰かが私にどのループを使用する方が良いかを理解するのを手伝ってくれることを願っています。
どちらがパフォーマンスに優れていますか?
それは問題ではありません。
ループを選択する基準は何ですか?
オブジェクトまたは配列のすべての要素をウォークスルーする必要があるだけの場合は、foreach
を使用します。 必要for
が含まれるケース
foreach
は、カウントを設定する必要がなく、オブジェクトプロパティや連想配列要素(for
キャッチしません)。通常は、読みやすくするために最適です。
別のループ内でループするときにどちらを使用する必要がありますか?
どちらも問題ありません。デモの場合、foreach
が最も簡単な方法です。
どちらがパフォーマンスに優れていますか?
誰も気にしない?それは重要ではありません。ずっと。このような小さな最適化が重要である場合、PHPは使用しません。
ループを選択する基準は何ですか?
読みやすく、間違いを起こしにくいものを選んでください。整数をループする場合、for
ループは最適です。配列のようなコレクションをループする場合はforeach
が最適です。「完了」するまでループするだけの場合はwhile
が最適です。
これは文体のルールにも依存する可能性があります(たとえば、Pythonでは、ほとんどの場合foreachループを使用する必要があるのは、これが「Pythonで行われる方法」であるためです)。標準はPHPですが。
別のループ内でループするときにどちらを使用する必要がありますか?
どちらのループタイプが最も理にかなっています(上記の回答を参照)。
コードでは、開始インデックスと終了インデックスが定義されているので、for
ループはかなり自然に見えます。
いくつかの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回だけ実行されます。
for
ループとwhile
ループのどちらを選択しても問題ありません。反復回数によって実行時間が決まります。for
ループを選択します。ある条件で実行および停止する場合は、while
ループを使用します私の知る限りでは、whileループとforループのパフォーマンスの違いはほとんどないかまったくないので、for-eachループについてはわかりません
パフォーマンス:テストするのに十分簡単です。機械学習やビッグデータなどを実行している場合は、コンパイル済みまたはアセンブル済みであり、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);
基準:while 、 for 、そして foreach は、ほとんどの人がPHPで使用する主要な制御構造です。 do-while は私のテストではwhile
よりも高速ですが、ほとんどのPHP Web上のコーディング例ではほとんど使用されていません。
for
はカウント制御されるため、特定の回数反復します。私自身の結果では、同じものにwhile
を使用するよりも遅いですが。
while
は、何かがfalse
で始まる場合に適しているため、何かが実行されたりリソースを浪費したりするのを防ぐことができます。
do-while
少なくとも1回、条件がfalse
を返すまで。結果のwhile
ループより少し高速ですが、少なくとも1回は実行されます。
foreach
は、array
またはobject
を反復するのに適しています。配列構文を使用してfor
ステートメントで文字列をループすることはできますが、PHPではforeachを使用してループを行うことはできません。
制御構造のネスト:これは、使用する制御構造中に決定するために何をしているのかによりますネストするとき。オブジェクト指向プログラミングのようないくつかのケースでは、多くのネストされたコントロールを含む手続き型の大規模なプログラムを使用するのではなく、コントロール構造を含む関数を(個別に)呼び出したい場合があります。これにより、読み取り、デバッグ、インスタンス化が容易になります。