Page 1 sur 1

simplifier code

Posté : 06 janv. 2009, 14:25
par Invité
Bonjour, existe t-il une syntaxe, des astuces ou des fonctions pour raccourcir ce bout de code:
		foreach ($_SESSION['cart'] as $a => $b)
		{
			if (is_array($b))
			{
				foreach ($b as $c => $d)
				{
					if (is_array($d))
					{
						foreach ($d as $e => $f)
						{
							if (is_array($f))
							{
								foreach ($f as $g => $val)
								{								
									$order_total += $val;
								}
							}
						}
					}
				}
			}
		}
Merci pour vos réponses.

Posté : 06 janv. 2009, 14:43
par Berzemus
la récursion ?

Juste pour le plaisir (non testé, probablement une faute quelque part,mais l'idée y est) :
function calcul($table)
  {
  $total = 0;
  foreach ($table as $val)
    {
    $total += (is_array($val)) ? calcul($val) : $val;
    }
  return $total;
  }
et il suffit de l'appeler avec le tableau en argument:
$total_final = calcul($table);

Posté : 06 janv. 2009, 16:07
par edison1986
Bonjour,

Ce que tu lui met ne fait pas tout a fait la même chose se serai plutôt ça :
<?php

function calcul($table, $nb_sous_tableau)
{
	$total = 0;
	
	foreach($table as $val)
	{
		if($nb_sous_tableau != 0 && is_array($val))
		{
			$nb_sous_tableau--;
			$total = calcul($val, $nb_sous_tableau);
		}
		elseif($nb_sous_tableau == 0)
		{
			$total += $val;
		}
	}
	
	return $total;
}

$order_total = calcul($_SESSION['cart'], 3);

?>

Posté : 06 janv. 2009, 16:25
par Berzemus
Bonjour,

Ce que tu lui met ne fait pas tout a fait la même chose se serai plutôt ça :
Pour aussi loin que je vois, tu ne fais qu'introduire des opportunités de plantage...

Quid si on oublie de préciser les sous-tableaux ?
Quid si on spécifie un mauvais nombre de sous-tableaux ?

La seule chose que je trouve qui manque, ce sont des structures de contrôle: si le paramètre est bien un tableau, et si les valeurs qu'ils contient sont bien des chiffres.

De toute façon, je doute qu'on ne mette que des chiffres dans un tableau. Le code pourrait être adapté pour ne rechercher qu'une certaine clé, dans un tableau, et il s'occuperait alors de parcourir tout le tableau à la recherche des toutes ces clefs, et de les additionner un à un.

Posté : 06 janv. 2009, 16:32
par edison1986
Je ne dit pas que cette fonction est la meilleur je dit juste qu'elle fait exactement la même chose que ce qu'il nous à donné contrairement à la tienne.

De plus lorsque tu dit
Quid si on oublie de préciser les sous-tableaux ?
c'est un peu bidon à ce moment la on peu dire que s'il oubli le <?php sa ne marchera pas non plus ou s'il ne branche pas son clavier sa ne marchera toujours pas...

Cette fonction n'est peut être pas exempte de tout reproche mais sa lui donne une piste d'amélioration.

Posté : 06 janv. 2009, 16:46
par Berzemus
Je ne dit pas que cette fonction est la meilleur je dit juste qu'elle fait exactement la même chose que ce qu'il nous à donné contrairement à la tienne.

De plus lorsque tu dit
Quid si on oublie de préciser les sous-tableaux ?
c'est un peu bidon à ce moment la on peu dire que s'il oubli le <?php sa ne marchera pas non plus ou s'il ne branche pas son clavier sa ne marchera toujours pas...

Cette fonction n'est peut être pas exempte de tout reproche mais sa lui donne une piste d'amélioration.
C'est une question d'expérience. Il à donné un exemple. Ce à quoi je répond par un exemple de solution. Si ses données concrètes sont un peu différent de ce qu'il montre, ça ne marcherait pas, voilà pourquoi je ne cherche pas à coller aux exemples.

Et je n'aime pas donner non plus des solutions toutes faites, donc je privilégie la piste, comme d'utiliser les clés nommées pour stocker des valeurs, plutôt que de compter sur leur position hiérarchique dans le tableau.

Il faut aussi prendre en compte que le code est appelé à vivre, et que peut-être un jour, la structure du tableau changera. On gardera plus vite le nom d'une valeur plutôt que sa position, et si on ne prend pas garde, un petit changement peut provoquer une avalanche d'erreurs, et donc il vaut mieux construire un code tolérant et évolutif. Comment faire pour qu'a ce moment, quelqu'un se souvienne qu'il faut modifier un petit numéro lors de l'appel d'une fonction ou l'autre, et pourquoi ?

Les erreurs ne se commettent pas dans l'immédiat, mais dans la durée, quand tout le monde à oublié comment et pourquoi il faut faire certaines choses. C'est juste ça que je dis, tu ne propose pas vraiment une amélioration. Dans le court-terme ça peut fonctionner, mais dans le long-terme, c'est prendre de gros risques.

Posté : 06 janv. 2009, 16:50
par edison1986
OK je comprend mieux ce que tu veut dire, mea-culpa. J'essaierais de tenir compte de tes conseil la prochaine fois.

Passe une bonne journée.