Page 1 sur 1

Effectuer des boucles for avec des nombres décimaux

Posté : 08 déc. 2006, 17:38
par Victor BRITO
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;
?>

Posté : 11 déc. 2006, 04:11
par Hubert Roksor
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>

Posté : 11 déc. 2006, 21:36
par Ouaibou
---

Posté : 11 déc. 2006, 21:51
par naholyr
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 ^^

Posté : 11 déc. 2006, 23:06
par iclo
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