Trier affichage requète selon une variable

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 avr. 2008, 01:29

Précision : je ne disais pas ça pour méchamment. J'ai juste l'impression que tu avances à l'aveuglette, et ça ne sert à rien. Demain, je te redonnerai du code en essayant d'expliquer chaque partie.

Il faut vraiment que tu rentres bien dans le système de tes tableaux pour comprendre comment fonctionnera le tri ensuite. Je pense qu'il serait bien que tu travailles sur le problème en dehors de ton script général, avec un code particulier. En commençant avec un tableau rempli de manière statituqe (données écrites par toi-même, en dur) et en ajoutant petit à petit les éléments qui t'approcheront du résultat, ce sera plus simple. C'est d'ailleurs un bon moyen en général, isoler le problème, travailler dessus et comprendre le fonctionnement pour ENSUITE l'incorporer dans son code métier.

Faire une pause ça sera bien aussi :)

Eléphanteau du PHP | 20 Messages

09 avr. 2008, 02:54

Salut ouckileou


ne t'en fais pas, je sais bien que ce n'était pas méchant. Néanmoins je t'assure que j'ai bien fait et regardé ce que tu m'as dit (tes codes, le manuel etc...).

Je pensais pas que ca serait si compliqué de trier ces résultats, je me serais peut etre pas lancé la dedans comme ca le cas échéant. Pour parvenir plus facilement à la solution, je crois qu'il faudrait comme tu le suggères que je commence tout simplement par le début et essayer de mieux comprendre cette histoire de tableaux en commencant par un truc tout simple. Puis en y allant crescendo.

Le manuel php est sans doute une bonne référence quand on maitrise déjà un minimum mais c'est vraiment pas très clair pour un neophyte. Je vais essayer de trouver un "tutorial" plus simple et détaillé.

Si tu as le temps de me redonner une piste demain je veux bien, ca m'aidera certainement.


Mais t'embète pas non plus, je vais laisser ca de coté quelques jours et essaierai de me motiver pour comprendre le fonctionnement de ces tableaux multi-dimensionnels quand j'aurais retrouvé le courage de reprendre ca à plat.


Merci en tout cas pour ton aide jusqu'ici.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 avr. 2008, 12:22

Bon voici ce que j'ai fait :
<?php
$prix = 250; // tu récupères normalement cette variable depuis ton formulaire
echo 'Prix = '.$prix.'<br /> <br />'; // affichage

$tableau = array( // ce tableau serait dans ton cas la ressource renvoyée par mysql_query()
	array('article'=>'article A', 'montant' => 199, 'coef' => 0.5), // correspond à une ligne renvoyée par la requête "SELECT article, montant, coef FROM calcul WHERE min <= $prix AND max >= $prix'"
	array('article'=>'article B', 'montant' => 299, 'coef' => 1),
	array('article'=>'article C', 'montant' => 399, 'coef' => 1.2),
	array('article'=>'article D', 'montant' => 499, 'coef' => 1.5),
	array('article'=>'article E', 'montant' => 599, 'coef' => 3),
	array('article'=>'article F', 'montant' => 699, 'coef' => 1),
);

foreach($tableau as $data) {  // correspond chez toi à while($data = mysql_fetch_assoc($req) vu qu'ici on a un tableau

	// calcul de la remise
	if($data['montant'] < $prix) { 
		$res = $data['montant'];
	} else  {
		$res = ($data['coef'] * $prix);
	}

	if($data['montant'] < $res) { 
		$res = $data['montant'];
	}

	// stockage de la valeur calculée (remise) dans le tableau $data : on ajoute une nouvelle colonne 'remise' avec comme valeur $res
	$data['remise'] = $res;
	
	// on stocke le tableau $data dans une nouvelle cellule de $tableau_articles
	$tableau_articles[] = $data;
}

/* On a maintenant un tableau de lignes (tableau A)
$tableau_articles est un tableau à plusieurs dimensions, puisqu'on a $tableau_articles[0]['article'], $tableau_articles[0]['remise'] etc
$tableau_articles[0] = | article | montant | coef | remise |
$tableau_articles[1] = | article | montant | coef | remise |
$tableau_articles[2] = | article | montant | coef | remise |
$tableau_articles[3] = | article | montant | coef | remise |
*/
?>
<!-- le HTML ici  sert juste à l'affichage, pour présenter les données traitées -->
Tableau non trié :<br />
<table border="1">
	<tr>
		<td>Article</td><td>Prix</td><td>Coef</td><td>Remise</td>
	</tr>
<?php
	foreach($tableau_articles as $article) {
		echo '<tr>';
		echo '<td>'.$article['article'].'</td><td>'.$article['montant'].'</td><td>'.$article['coef'].'</td><td>'.$article['remise'].'</td>';
		echo '</tr>';
	}
	
?>
</table>
<br /> <br />
Tableau trié sur la remise :<br />
<table border="1">
	<tr>
		<td>Article</td><td>Prix</td><td>Coef</td><td>Remise</td>
	</tr>
<?php
	// On veut ici un tableau de colonnes
	// On regroupe dans chaque tableau les valeurs de même type (un tableau pour les articles, un pour les montants etc)
	// La correspondance entre un montant et sa remise se fera grâce aux clés numériques
	foreach ($tableau_articles as $key => $row) {
		// si on regarde le tableau A affiché plus haut, on voit que $key vaudra 0,1,2,3 et $row sera un tableau [| article | montant | coef | remise |]
	    $article[$key]  = $row['article'];
	    $montant[$key] = $row['montant'];
		$coef[$key] = $row['coef'];
		$remise[$key] = $row['remise'];
	}
	/* On obtient
	$article : | article 0 | article 1 | article 2 | article 3 |
	$montant : | montant 0 | montant 1 | montant 2 | montant 3 |
	$coef : | coef 0 | coef 1 | coef 2 | coef 3 |
	$remise : | remise 0 | remise 1 | remise 2 | remise 3 |
	*/
	
	// on demande ici  de trier le tableau $remise en ordre décroissant, en gardant les correspondances au sein du tableau $tableau_articles avec les clés numériques communes
	array_multisort($remise, SORT_DESC, $tableau_articles);
	
	// on l'affiche
	foreach($tableau_articles as $produit) {
		echo '<tr>';
		echo '<td>'.$produit['article'].'</td><td>'.$produit['montant'].'</td><td>'.$produit['coef'].'</td><td>'.$produit['remise'].'</td>';
		echo '</tr>';
	}
?>
</table>
J'ai commenté chaque ligne, maintenant si tu as une question sur un point précis, demande. Dès que tu vois un élément de syntaxe inconnu, ou que tu ne comprends pas dans le contexte, va voir dans la doc.

Quand tu es sur une page du manuel, pense à regarder les exemples (je suis d'accord que la signature d'une méthode et l'explication des paramètres ne sont pas toujours très facile à comprendre). Fais aussi de petits scripts de test pour manipuler les tableaux, utiliser les fonctions que tu découvres, ainsi tu comprendras bien chaque chose.

Eléphanteau du PHP | 20 Messages

09 avr. 2008, 15:10

D'accord merci pour ton code commenté. Je l'ai juste regardé en détail sans le tester pour l'instant, j'imagine de toute façon que ca marche :)


Je tiens à reprendre cette histoire d'arrays en détail parce que ca me semble important pour la suite. Je comptais pas vraiment voir ca tout de suite mais puisque j'ai commencé à mettre le nez dedans... J'ai trouvé deux tutoriels assez clairs et détaillés, j'ai déjà commencé à lire chaque étape pour mieux comprendre. C'est toujours pas totalement clair mais une fois que j'aurais testé chaque exemple ca sera sans doute mieux. Je tiens à bien comprendre cettte histoire de tableaux quand même, ca m'agace que ca soit aussi confus.

En ce qui concerne ton code, ca m'amène plusieurs questions en effet. C'est sans doute des questions qui vont te sembler évidentes... :

- ta boucle "foreach($tableau as $data)" est à supprimer dans mon cas et à remplacer par while($data = mysql_fetch_assoc($req) : tu as uniquement remplacé mon while par un foreach étant donné que ton tableau était déjà fait, c'est bien ca ?

- je ne comprends pas tout à fait "$tableau_articles[] = $data;" (ca sera sans doute plus clair une fois que j'aurais regardé plus en détail les deux tutoriels que j'ai trouvé). Pour moi $data se présentait exactement de la même forme que $tableau_articles soit :

Code : Tout sélectionner

$data[0] = | article | montant | coef | remise | $data[1] = | article | montant | coef | remise | $data[2] = | article | montant | coef | remise | $data[3] = | article | montant | coef | remise |
- je comprends pas tout à fait non plus pourquoi on passe le tableau en colonnes alors qu'en ligne la disposition me convenait tout à fait (ce qui équivaut donc à $tableau_articles dans ton code). Je sais que ca n'est pas bon mais intuitivement j'aurais bien bien fait ensuite directement quelque chose comme :

Code : Tout sélectionner

array_multisort($data['remise'], SORT_DESC, $tableau_articles);
puis ton foreach.


Donc en fait j'aurais zappé $tableau_articles[] = $data; , ainsi que la partie ou on met le tableau en colonnes : foreach ($tableau_articles as $key => $row) jusqu'à $remise[$key] = $row['remise'];

Cela vient déjà sans doute de ma confusion entre $data et $tableau_articles qui sont similaires pour moi. Je vais faire un print_r sur les deux pour mieux me les représenter et voir la différence.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 avr. 2008, 15:57

j'imagine de toute façon que ca marche :)
Oui :-)
- ta boucle "foreach($tableau as $data)" est à supprimer dans mon cas et à remplacer par while($data = mysql_fetch_assoc($req) : tu as uniquement remplacé mon while par un foreach étant donné que ton tableau était déjà fait, c'est bien ca ?
Oui, moi j'utilise un tableau à plusieurs dimensions (un tableau général qui contient plusieurs autres). Toi, tu utilises une ressource MySQL (voir doc) + mysql_fetch_assoc() qui te renvoie un tableau par ligne de résultats. C'est du détail, ne te prend pas la tête là dessus. La structure reste globalement la même.
- je ne comprends pas tout à fait "$tableau_articles[] = $data;" (ca sera sans doute plus clair une fois que j'aurais regardé plus en détail les deux tutoriels que j'ai trouvé). Pour moi $data se présentait exactement de la même forme que $tableau_articles soit :
C'est très simple :
$tableau_articles = $data; // $data est COPIE dans $tableau_articles, $tableau_articles contient ensuite $data, et uniquement $data, $tableau_articles == $data
$tableau_articles[] = $data; // $data est AJOUTE à $tableau_articles, dans une nouvelle cellule
Fais un test avec deux tableaux bidons avec et sans [] et des print_r(), tu verras bien la différence.
- je comprends pas tout à fait non plus pourquoi on passe le tableau en colonnes
Parceque c'est explicitement marqué dans la doc, dans l'exemple "trier des résultats de base de données. array_multisort() a besoin de cette entrée (elle trie des données dans un même tableau, pas dispersées entre plusieurs)

Il faut vraiment que tu comprennes le concept de tableaux multidimensionnels, fais des schémas s'il le fait, après ça roulera tout seul.