while et for sur tableau

while et for sur tableau - PHP - Programmation

Marsh Posté le 11-01-2012 à 10:18:06    

Bonjour à tous,
Voila mon problème:
je dois créer un tableau en utilisant une boucle while et ensuite une boucle for (pour tester la difference d'utilisation entre les deux, il s'agit d'un exo).
J'ai donc adapté mon code ac while pour la boucle for et là j'ai un message d'erreur :
Parse error: syntax error, unexpected T_WHILE
 
<?php
// DECLARATION TABLEAU + UTILISATION DE WHILE
$tableau = array(1, 1, 2, 3, 5, 8, 13);
 
$i=0;  
 
while($i<count($tableau))
{  
  echo $tableau[$i] . '<br />';  
  $i++;  
}  
?>
 
<?php
// DECLARATION TABLEAU + UTILISATION DE FOR
$tableau=array(1,2,3,4,5,6,7);
for($i=0;$i<count($tableau);$i++)
{ echo $tableau[$i].'<br/>';}
?>

Reply

Marsh Posté le 11-01-2012 à 10:18:06   

Reply

Marsh Posté le 11-01-2012 à 13:59:51    

Ton code est juste. Chez moi il tourne parfaitement.


---------------
Je ne donne que des pistes. A chacun de les travailler. creation de sites internet
Reply

Marsh Posté le 11-01-2012 à 14:03:56    

ah ben alors je suis complètement à la masse moi.
J'ai vérifié pourtant moult fois et kedal
Désolé pour le dérangement , je m'en vais de ce pas vérifier de mon côté pourquoi cela ne fonctionne pas chez moi
Merci eric

Reply

Marsh Posté le 11-01-2012 à 14:09:27    

Petite remarque : éviter de mettre le count dans le while et le for mais plutôt le mettre avant et stocker le résultat dans une variable parce qu'il me semble que le count sera réévaluer à chaque tour de boucle. Sur un petit tableau, pas de pb mais sur un gros, ça peut être pénalisant... ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-01-2012 à 14:17:32    

effectivement remarque intéressante.
Je pensais ne pas pouvoir déclarer de variable avant le for, bêtement.  
Donc du coup j'y suis allé à la brutor

Reply

Marsh Posté le 12-01-2012 à 01:36:01    

pour le for tu as aussi la syntaxe suivante qui est valide :

Code :
  1. for ($i=0,$j=count($tableau);$i<$j;echo $tableau[$i].'<br/>',$i++);
  2. ou
  3. for ($i=0,$j=count($tableau);$i<$j;echo $tableau[$i].'<br/>',$i++){
  4.     //la tu peux faire un truc AVANT l'execution de echo "$tableau[$i].'<br/>',$i++"
  5. }


 
3 expressions separées par des ";"soient :
- condition de depart evalué 1 fois
- condition de test evalué a chaque fois
- instructions executé a chaque fin de boucle
a noter que "," sert de separateur de "sous expressions"
 
c'est un peu illisible comme ca mais on s'y fait tres bien, en général je reserve "$i" et "$ii" pour pas avoir de probleme de boucles imbriquées.
ca semble servir a rien de lancer des commandes a la fin mais dans des cas comme afficher des retours a la ligne c'est assez pratique genre
 

Code :
  1. for ($i=0,$ii=count($tableau);$i<$ii;echo '<br/>',$i++){
  2.     echo $tableau[$i];
  3. }


 
ce qui permet de degager du code parasite de la lecture


---------------
Plop !
Reply

Marsh Posté le 12-01-2012 à 09:56:04    

Je ne connaissais pas cette syntaxe. Intéressant...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 12-01-2012 à 16:52:23    

pop-pan a écrit :

pour le for tu as aussi la syntaxe suivante qui est valide :

Code :
  1. for ($i=0,$j=count($tableau);$i<$j;echo $tableau[$i].'<br/>',$i++);
  2. ou
  3. for ($i=0,$j=count($tableau);$i<$j;echo $tableau[$i].'<br/>',$i++){
  4.     //la tu peux faire un truc AVANT l'execution de echo "$tableau[$i].'<br/>',$i++"
  5. }


 
3 expressions separées par des ";"soient :
- condition de depart evalué 1 fois
- condition de test evalué a chaque fois
- instructions executé a chaque fin de boucle
a noter que "," sert de separateur de "sous expressions"
 
c'est un peu illisible comme ca mais on s'y fait tres bien, en général je reserve "$i" et "$ii" pour pas avoir de probleme de boucles imbriquées.
ca semble servir a rien de lancer des commandes a la fin mais dans des cas comme afficher des retours a la ligne c'est assez pratique genre
 

Code :
  1. for ($i=0,$ii=count($tableau);$i<$ii;echo '<br/>',$i++){
  2.     echo $tableau[$i];
  3. }


 
ce qui permet de degager du code parasite de la lecture


 
C'est syntaxiquement OK, mais à proscrire, ce n'est pas de la programmation ça, mais du code de merde clairement, pas maintenable dans la longueur, tout ça pour gagner quelques lignes... super... :o
 
Sérieusement, s'il veut avoir quelque chose avant le echo, soit il fait un do...while (même si ce n'est pas recommandé non plus en général pour avoir un code clair), soit plus simple il fait un if ($i !== 1), ça peut paraitre laid, mais c'est rapidement compréhensible par quiquonque.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 12-01-2012 à 23:24:49    

houla t'excites pas :) c'est simplement pour montrer que la syntaxe existe et peut etre rencontrée (souvent dans les libs javascript d'ailleurs)
 
c'est pratique dans certains cas et je trouve ca largement moins horrible que des lignes ou les variables php ne sont pas proprement concaténées ou des boucles for avec des break bien violent planqués dans 200 lignes non indentées.
 
c'est comme tous les patterns de code qu'on apprend a reperer rapidement ou des regex avec moults backreferences.
 
en meme temps j'utilise tres rarement "for" aujourd'hui en php, je prefere tres largement "foreach" et encore la dessus on peut trouver a redire car comme tout le monde j'ai mes preferences.
 
je prefere toujours

Code :
  1. foreach($collection as &$element){
  2. // code
  3. }


 
a  
 

Code :
  1. foreach($collection as &$element):
  2. // code
  3. endforeach;


 
meme si je n'ai aucun argument pour si ce n'est la force de l'habitude car clairement la seconde syntaxe est plus explicite et lisible.


---------------
Plop !
Reply

Marsh Posté le 13-01-2012 à 14:41:24    

Fait pour l'occasion :
 
[:gordonf_69:5]

Reply

Marsh Posté le 13-01-2012 à 14:41:24   

Reply

Marsh Posté le 13-01-2012 à 16:15:40    

boarf, en meme temps je peux comprendre, a chaque gros proj auxquel j'ai participé une des premieres session de groupe c'etait toujours code convention.
 
apres je peux passer sur du code et dire que c'est de la merde de que ca respecte pas les normes que j'utilise par defaut :
- pas > 70 caracteres/ligne
- pas plus de 25 lignes par fonction/methode => force implicitement les accolades ouvrantes en fin de ligne
- accolades obligatoires meme si le "if" contient qu'une seule ligne par exemple
- lettercase et pas delimiter
- affectations tabulées pour ameliorer la lisibilité
- "_" pour commencer toutes les privates
- utilisations de references et pas de recopies si ca sert a rien (en java et C c'est pas applicable)
- iterators des que possible
... et plein d'autres
 
le pire c'est que j'en connais qui bloquent si c'est pas en hungarian... ce que je peux comprendre des qu'il y a typage fort
 
alors un mec qui m'annonce que mon code est crade parce qu'il ne respecte pas SA norme ca me fait doucement rigoler, on est pas la pour faire les ayatollah mais pour montrer au gens ce qui est faisable.
 
de plus selon les languages et la facon dont on s'en sert on code pas de la meme facon, ne serait ce qu'en php on code/optimise pas exactement pareil si on sait que ca va etre compilé ou aller dans un scripts cache.


Message édité par pop-pan le 13-01-2012 à 16:23:44

---------------
Plop !
Reply

Marsh Posté le 14-01-2012 à 15:59:10    

tu mets pas un unset après le foreach en assignant dans une référence ?
Perso, je trouve que ça évite les mauvaises surprises même si c'est un peu lourd.
 
Exemple:

Code :
  1. <?php
  2. $a = array(1,2,3);
  3. foreach($a as &$e) {
  4.         print $e;
  5. }
  6. $e = 100;
  7. var_dump($a);
  8. ?>
  9. ^Z
  10. 123array(3) {
  11.   [0]=>
  12.   int(1)
  13.   [1]=>
  14.   int(2)
  15.   [2]=>
  16.   &int(100)
  17. }

Message cité 1 fois
Message édité par raskt le 14-01-2012 à 16:02:32
Reply

Marsh Posté le 14-01-2012 à 16:45:08    

raskt a écrit :

tu mets pas un unset après le foreach en assignant dans une référence ?
Perso, je trouve que ça évite les mauvaises surprises même si c'est un peu lourd.
 
Exemple:

Code :
  1. <?php
  2. $a = array(1,2,3);
  3. foreach($a as &$e) {
  4.         print $e;
  5. }
  6. $e = 100;
  7. var_dump($a);
  8. ?>
  9. ^Z
  10. 123array(3) {
  11.   [0]=>
  12.   int(1)
  13.   [1]=>
  14.   int(2)
  15.   [2]=>
  16.   &int(100)
  17. }



Bah déjà, on ne fait pas de foreach avec une référence si on ne veux faire que de la lecture (d'autant que pour un int/float, la référence faisant la même taille, c'est aussi rapide de renvoyer l'int que la référence, pour un char c'est plus long car un char ne fait que 8 bits et la référence 32/64 bits, pour un objet/array c'est déjà une référence, en fait seul les string profiterais de cette syntaxe point de vue perf./RAM).
 
Après, clairement c'est un pb de PHP que d'avoir un scope de variable pas terriblement géré, car référence ou pas, si l'interpréteur était propre, vu que $e est déclaré dans le scope du foreach, il ne devrait pas être accessible hors du foreach. :'(


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed