Puis je faire mieux que 'switch case' dans ce cas?

Mammouth du PHP | 545 Messages

05 mars 2008, 15:33

Bonjour,

J'ai trouvé une possibilité pour donner une position par catégorie dans un classement de course à pied en faisant ceci:
foreach($claslist as $key => $clas){
	$claslist[$key]->nom = '<a href="' . $link . $clas->participant_id . '">' . $clas->nom . '</a>';
	$claslist[$key]->prenom = '<a href="' . $link . $clas->participant_id . '">' . $clas->prenom . '</a>';
	
	switch ($claslist[$key]->cat_id){
		case '1':
			$a ++;
			$poscat = $a;
		break;
		
		case '2':
			$b ++;
			$poscat = $b;
		break;
		
		case '3':
			$c ++;
			$poscat = $c;
		break;
		
		case '4':
			$d ++;
			$poscat = $d;
		break;
		
		case '5':
			$e ++;
			$poscat = $e;
		break; 
		
		default:
			$poscat = '';
		break;
		}
	
	$claslist[$key]->poscat =  $poscat;
	}
Mes questions sont:
Etant donné que j'ai 15 catégories différentes est-ce que le 'switch case' est la meilleure idée ?
Il est possible qu'un jour il faille ajouter d'autres catégories dans la base de données, comment puis-je construire une boucle afin que cette nouvelles donnes soient prises en compte sans que je doivent replonger dans le code ?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

d0m
Mammouth du PHP | 1141 Messages

05 mars 2008, 15:49

je pense que tu peux faire cela de manière générique en utilisant les tableaux :

tu remplace les variables $a, $b,... $e par un tableau de variables $les_variables avec comme index le numéro de cas :
$a correspond à $les_variables[1];
...

et donc remplacer le case par une seule ligne de code

Eléphant du PHP | 445 Messages

05 mars 2008, 16:16

Je ne suis pas sur mais essayes cela :

Remplaces ton switch par :
$variable = Array('a','b','c','d','e') ;

$poscat = (isset($($variable[$claslist[$key]->cat_id])))?++$($variable[$claslist[$key]->cat_id]):'';
Cela n'est pas très lisible par contre.

d0m
Mammouth du PHP | 1141 Messages

05 mars 2008, 16:29

Je ne suis pas sur mais essayes cela :

Remplaces ton switch par :
$variable = Array('a','b','c','d','e') ;

$poscat = (isset($($variable[$claslist[$key]->cat_id])))?++$($variable[$claslist[$key]->cat_id]):'';
Cela n'est pas très lisible par contre.
Le problème est que lorsque tu ajouteras une catégorie, il faudra modifier le tableau de variable.
Si déjà tu as des identifiants de catégorie numérique, autant les garder tout le long.

Tu crées le tableau de variables en l'initialisant à 0 pour toutes tes catégories au début de ton script avec une boucle sur les numéros de catégories.

Mammouth du PHP | 545 Messages

06 mars 2008, 11:11

Salut,

La nuit portant conseil, je suis parti sur quelque chose d'autres qui n'allonge pas mon code mais qui peut-être l'alourdit ... là vous me le direz !

J'ai donc fait une requête supplèmentaire pour lister toutes les catégories:
$query = "SELECT id"
	. "\n FROM #__classement_cat"
	;
	$database->setQuery( $query );
	$categorie = $database -> loadAssocList();
Et fait l'ajout d'un for() dans la boucle foreach():
foreach($claslist as $key => $clas){

	$claslist[$key]['nom'] = '<a href="' . $link . $clas['participant_id'] . '">' . $clas['nom'] . '</a>';
	$claslist[$key]['prenom'] = '<a href="' . $link . $clas['participant_id'] . '">' . $clas['prenom'] . '</a>';
	
	list($hour, $min, $sec) = explode(":", $clas['moyenne']);
	$claslist[$key]['moyenne'] = $min . ':' . $sec;
	
	for ($k=0; $k<100; $k++){
		if($categorie[$k][id] == $claslist[$key]['cat_id']){
			$poscat[$k] ++;
			$pc = $poscat[$k];
			}
		}
	$claslist[$key]['poscat'] =  $pc;
	}
J'ai juste un doute sur la variable $k qui pourrait être réduite au nombre de catégories différentes ... dans ce cas comment je dois faire ?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Eléphant du PHP | 445 Messages

06 mars 2008, 16:38

count() retourne le nombre d'elements d'un tableau.

Mammouth du PHP | 545 Messages

07 mars 2008, 00:28

Un grand merci
count() retourne le nombre d'elements d'un tableau.
Voici mon code:
$query = "SELECT id FROM #__classement_cat";
	$database->setQuery( $query );
	$categorie = $database -> loadAssocList();//loadObjectList();
	if ($database -> getErrorNum()) {
		echo $database -> stderr();
		return false;
		}

$count = count($categorie);

....
for ($k=0; $k<=$count+1; $k++){
		if($categorie[$k][id] == $claslist[$key]['cat_id']){
			$poscat[$k] ++;
			$pc = $poscat[$k];
			}
		}
	$claslist[$key]['poscat'] =  $pc;
Merci à tous
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!