Effectuer des boucles for avec des nombres décimaux

Mammouth du PHP | 2937 Messages

08 déc. 2006, 17:38

Salut à tous!

Il se peut qu'avant d'effectuer une boucle for, vous ne sachiez pas vraiment si les nombres à manipuler dans la variable $i sont entiers ou décimaux. Et, pour ces derniers, il se peut que vous ne sachiez pas vraiment non plus combien il y a de chiffres après la virgule.

En revanche, vous avez la possibilité de récupérer les deux nombres extrêmes qui délimiteront la boucle for.

La fonction suivante permettra de paramétrer la boucle selon le type de nombres, l'absence ou non de chiffres après la virgule et le nombre de ces derniers, le cas échéant.
<?php 
function decimale($nombre){
  // On vérifie la présence d'une virgule dans le nombre
  $virgule=strpos($nombre, '.');
  
  // S'il y en a, on définit le nombre 10 puissance n,
  // où n représente le nombre de chiffres après la virgule
  if ($virgule){
    $decimale=explode('.', $nombre);
    $decimale=$decimale[1];
    $decimale=strlen($decimale);
    $puissance=bcpow(10, $decimale);
  }
  
  // Sinon, on définit le nombre 1
  else $puissance=1;
  
  return $puissance;
}
?>
Des exemples d'application de cette fonction
<?php 
$min=-10.099;
$max=-10.001;
?>
<html>
<body>
<ul>
<?php 
// On multiplie les nombres extrêmes par 10 puissance n ou par 1, c'est selon
for ($i=$min*decimale($min); $i<=$max*decimale($max); $i++){
// Pour l'affichage, on divise le produit par le plus grand des deux nombres retournés par la fonction
?>
  <li><?php echo $i/max(decimale($min), decimale($max)) ?></li>
<?php 
// Affiche -10.099, -10.098, -10.097... -10.002, -10.001
}
?>
</ul>
</body>
</html>
<?php 
$min=5.1;
$max=5.9;
?>
<html>
<body>
<ul>
<?php 
// On multiplie les nombres extrêmes par 10 puissance n ou par 1, c'est selon
for ($i=$min*decimale($min); $i<=$max*decimale($max); $i++){
// Pour l'affichage, on divise le produit par le plus grand des deux nombres retournés par la fonction
?>
  <li><?php echo $i/max(decimale($min), decimale($max)) ?></li>
<?php 
// Affiche 5.1, 5.2, 5.3... 5.8, 5.9
}
?>
</ul>
</body>
</html>
<?php 
$min=100;
$max=110;
?>
<html>
<body>
<ul>
<?php 
// On multiplie les nombres extrêmes par 10 puissance n ou par 1, c'est selon
for ($i=$min*decimale($min); $i<=$max*decimale($max); $i++){
// Pour l'affichage, on divise le produit par le plus grand des deux nombres retournés par la fonction
?>
  <li><?php echo $i/max(decimale($min), decimale($max)) ?></li>
<?php 
// Affiche 100, 101, 102... 109, 110
}
?>
</ul>
</body>
</html>
Seule ombre au tableau, ça ne marche pas si l'on a affaire à des cas comme suit:
<?php 
// Nombre de chiffres après la virgule différent
$min=10.055;
$max=10.1;

// Un des nombres extrêmes ayant un ou plusieurs zéros après la virgule et à la fin
// (ce cas revient au même que celui ci-dessus)
$min=10.055;
$max=10.100;
?>

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

11 déc. 2006, 04:11

Je ne suis pas certain de saisir comment fonctionne ta méthode, mais sais-tu que tu peux tout à fait utiliser des nombres décimaux dans une boucle ? Par exemple:
<html>
<body>
<ul><?php  

	for ($i = 5.1; $i <= 5.9; $i += 0.1)
	{ 
		echo '<li>', $i, '</li>';
	}

?></ul>
</body>
</html>

Eléphant du PHP | 281 Messages

11 déc. 2006, 21:36

---
Modifié en dernier par Ouaibou le 07 juil. 2007, 11:15, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

11 déc. 2006, 21:51

for() est ultra-polyvalente, son format est très libre : for(initialisation de variable(s); expression booléenne; opérations)
Elle permet les lignes de codes les plus laides, compactes, et efficaces qu'on puisse écrire ^^

ViPHP
ViPHP | 2144 Messages

11 déc. 2006, 23:06

tout à fait puisqu'on peut "ommettre" certains des 3 paramêtres, mais c'est vrai que ça devient vite illisible. Question de propreté dans le code, on préférera utliser un while(), plutot que trop détourner le for de son usage premier :D