Tout d'abord, je suis nouveau en PHP. J'utilise for, boucle while, boucle foreach dans les scripts. je me demande
le code que je suis coincé avec se demandant quelle boucle utiliser.
for($i=0;$i<count($all);$i++)
{
//do some tasks here
for($j=0;$j<count($rows);$j++)
{
//do some other tasks here
}
}
Il est assez évident que je puisse écrire le code ci-dessus en utilisant while. J'espère que quelqu'un m'aidera à déterminer quelle boucle devrait être mieux utilisée.
lequel est le meilleur pour la performance?
Ça n'a pas d'importance.
quels sont les critères pour sélectionner une boucle?
Si vous avez juste besoin de parcourir tous les éléments d'un objet ou d'un tableau, utilisez foreach
. Cas où vous avez besoin for
include
foreach
est beaucoup plus pratique car il ne vous oblige pas à compter, et peut fonctionner à travers tout type de membre - que ce soit des propriétés d'objet ou des éléments de tableau associatif (qu'un for
ne capture pas). C'est généralement mieux pour la lisibilité.
qui devrait être utilisé quand on boucle dans une autre boucle?
Les deux vont bien; Dans votre cas de démonstration, foreach
est la solution la plus simple.
lequel est le meilleur pour la performance?
On s'en fout? Ce ne sera pas significatif. Déjà. Si ces petites optimisations importaient, vous n’utiliseriez pas PHP.
quels sont les critères pour sélectionner une boucle?
Choisissez celui qui est le plus facile à lire et le moins susceptible de causer des erreurs à l'avenir. Lorsque vous parcourez des entiers, les boucles for
sont excellentes. Lorsque vous parcourez une collection comme un tableau, foreach
est génial, lorsque vous avez juste besoin de boucler jusqu'à ce que vous ayez terminé, while
est génial.
Cela peut également dépendre de règles stylistiques (par exemple, dans Python, vous souhaiterez presque toujours utiliser une boucle foreach car c'est "comme cela se fait en Python"). Je ne suis pas sûr de savoir quelle est la norme dans PHP cependant.
qui devrait être utilisé quand on boucle dans une autre boucle?
Quel que soit le type de boucle le plus logique (voir la réponse ci-dessus).
Dans votre code, la boucle for
me semble assez naturelle, car vous avez un index de démarrage et d'arrêt défini.
Vérifiez http://www.phpbench.com/ pour une bonne référence sur certains points de repère PHP.
La boucle for est généralement assez rapide. N'incluez pas votre nombre ($ lignes) ni le nombre ($ tout) dans le pour soi, faites-le dehors comme ceci:
$count_all = count($all);
for($i=0;$i<$count_all;$i++)
{
// Code here
}
Placer le nombre ($ all) dans la boucle for lui permet de calculer cette instruction pour chaque boucle. Le calcul de la valeur en premier lieu, puis l'utilisation du calcul dans la boucle ne l'exécutent qu'une seule fois.
for
ou while
, le nombre d'itérations détermine le temps d'exécution.for
. Si vous souhaitez exécuter et arrêter une condition, utilisez une boucle while
À ma connaissance, il n'y a pas ou peu de différence de performance entre les boucles while et for, je ne connais pas les boucles for-each
Performance: Assez facile à tester. Si vous faites quelque chose comme l'apprentissage automatique ou le Big Data, vous devriez vraiment regarder quelque chose qui est compilé ou assemblé et non pas interprétési les cycles vraiment importent. Voici quelques points de repère entre les différents langages de programmation. On dirait que la boucle do-while
est gagnante sur mes systèmes en utilisant PHP
avec ces exemples.
$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);
Critères:while , pour , et foreach sont les principales structures de contrôle utilisées par la plupart des utilisateurs de PHP. do-while est plus rapide que while
dans mes tests, mais largement sous-utilisé dans la plupart des exemples de codage PHP sur le Web.
for
est contrôlé par le nombre, donc il itère un nombre spécifique de fois; bien que mes résultats donnent plus de lenteur que l’utilisation de while
pour la même chose.
while
est utile lorsque quelque chose peut commencer par false
, afin d'éviter que quelque chose ne s'exécute et ne gaspille des ressources.
do-while
au moins une fois, puis jusqu'à ce que la condition renvoie false
. C'est un peu plus rapide qu'une boucle while
dans mes résultats, mais elle s'exécutera au moins une fois.
foreach
est bon pour parcourir une array
ou object
. Même si vous pouvez parcourir une chaîne avec une instruction for
en utilisant la syntaxe d'un tableau, vous ne pouvez pas utiliser foreach pour le faire en PHP.
Imbrication de la structure de contrôle: _ Cela dépend vraiment de ce que vous faites pour déterminer la structure de contrôle while à utiliser lors de l'imbrication. Dans certains cas, comme la programmation orientée objet, vous voudrez en fait appeler des fonctions qui contiennent vos structures de contrôle (individuellement) plutôt que d'utiliser des programmes volumineux de style procédural contenant de nombreux contrôles imbriqués. Cela peut faciliter la lecture, le débogage et l’instanciation.