Trier affichage requète selon une variable

Eléphanteau du PHP | 20 Messages

07 avr. 2008, 02:41

Bon, j'ai pas résolu le problème...


Le mieux que j'ai pu faire c'est remplacer mes deux echo à la fin du script par un foreach qui affiche un array.

Code : Tout sélectionner

$tableau = array($res); ksort ($tableau,SORT_NUMERIC); foreach($tableau as $cle) { echo '- sur '.$data['titre'].' votre remise est de '.$cle.' euros.<br>'; }

Le script et l'affichage fonctionnent parfaitement comme au début sauf que je le tri ne s'effectue toujours pas malgré le SORT($tableau). J'ai essayé tous les autres : ksort, usort, asort etc... mais ca ne trie pas mieux.

Il doit y avoir quelque chose que je ne fais pas correctement. :-k

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

07 avr. 2008, 09:58

Pourquoi tu n'utilises pas les fonctions de tri sur les tableaux ?
http://uk2.php.net/manual/fr/ref.array.php

Sinon je n'ai pas compris la différence entre :
- avec tel article1 votre remise sera de 102 euros
- avec tel article2 votre remise sera de 98 euros
- avec tel article3 votre remise sera de 25 euros
et
- tel article1 102 euros
- tel article2 98 euros
- tel article3 25 euros
Si ce n'est la phrase qui change bien sûr

Edit: désolé je n'avais pas vu ton dernier message. Et celle-ci : http://uk2.php.net/manual/fr/function.a ... tisort.php :)

Eléphanteau du PHP | 20 Messages

07 avr. 2008, 13:30

Hello,


array_multisort est la seule que je n'ai pas essayé hier :roll: :) . Vu que je m'en sortais pas vraiment déjà avec les autres et que celle-ci semblait nettement plus complexe à mettre en oeuvre je l'ai zappée.

Bon bah je m'y recolle avec celle-ci alors :wink:

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphanteau du PHP | 20 Messages

07 avr. 2008, 15:16

Je dois pas être doué je sais pas...


Je viens d'essayer de comprendre array_multi sort pour l'appliquer à mon script et trier les résultats, et j'arrive à ca :

Code : Tout sélectionner

$tableau = array($res,$data['logiciel']); foreach ($tableau as $key => $row) { $volume[$key] = $row['res']; $edition[$key] = $row['logiciel']; } array_multisort($volume, SORT_DESC, $edition, $tableau); { echo "'.$volume.' '.$edition.'"; }

C'est pas faute d'avoir essayé plein de configurations différentes mais ca n'a toujours pas l'air de trier et 90% du temps j'ai un message d'erreur. Quelqu'un à une idée avant que je pète un plomb ?

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

07 avr. 2008, 16:11

Tu pourrais poster un tableau statique correspondant à ce que tu récupère après ta requête pour qu'on essaie ?

Au passage, SELECT * c'est mal, surtout si tu n'utilises pas tout :-)

Eléphanteau du PHP | 20 Messages

07 avr. 2008, 17:31

(Je me suis enregistré avec un autre pseudo mais c'est Kanta)


Oui j'ai lu ca en effet (pour le select *). Il se trouve que j'ai besoin de tous les champs de ma table mais merci pour ta remarque, ca aurait pu m'apprendre quelque chose de nouveau.


En ce qui concerne ma requète, je récupère plusieurs champs de ma table mais pour simplifier je préfèrais éviter de tous les énumérer car je ne souhaite en afficher que 3 dans le tableau et j'ai déjà assez de mal avec ces 3 là. Les autres champs appellés dans ma requète servent uniquement à calculer $res.


Les champs que je veux afficher sont :
- lien_article : lien vers la page descriptive de l'article
- article : l'article en question
- $res : le montant de la remise


Mon tableau serait tout simplement de la forme :

article remise

aaa xxx
bbb yyy


Sauf que je voudrais que ca s'affiche ainsi : avec aaa votre remise sera de xxx
avec bbb votre remise sera de yyy
etc pour chaque ligne correspondant à la requète.


array_multisort est peut être la fonction la mieux adaptée ici mais j'ai du mal à comprendre la logique de cette fonction et à quoi correspondent les variables etc...


Je remet mon script de départ ici pour plus de clarté :
$sql = "SELECT * FROM calcul WHERE min <= $prix AND max >= $prix'"; 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());   


$num_rows = mysql_num_rows($req); 
if($num_rows == 0) 
        { 
echo "<b><center>Désolé, il n'y a aucune réponse pour cette somme.</center></b>"; 
        } 
  else 


while($data = mysql_fetch_assoc($req))  

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

$res = ($data['coef'] * $prix); 

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


    echo '- avec <b><a href='.$data['lien_article'].' class="tit3">'.$data['article'].'</a></b> votre remise sera de '.$res.'.br>'; 
    } 
(je rappelle que $prix est déterminé auparavant dans un formulaire)


Si tu as quelque chose à me suggérer, c'est avec grand plaisir :P

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

07 avr. 2008, 18:01

Fais un print_r() du tableau que tu essaies de trier et poste le
echo '<pre>';
print_r($tableau);
echo '</pre>';
Edition :

Tu as lu la doc de array_multisort() ? Notamment les exemples qui y sont donnés ?
Parcequ'il y en a un qui s'appelle "Example#3 Classer les résultats d'une base de données" et qui correspond exactement à ce que tu veux faire.

J'ai quasiment copié/collé le code de l'exemple et ça fonctionne très bien :
<?php
$tableau = array(
	// tri attendu suivant la remise : F, B, D, A, E, C
	array('article'=>'article A', 'prix' => 199, 'remise' => '20'),
	array('article'=>'article B', 'prix' => 299, 'remise' => '50'),
	array('article'=>'article C', 'prix' => 399, 'remise' => '10'),
	array('article'=>'article D', 'prix' => 499, 'remise' => '40'),
	array('article'=>'article E', 'prix' => 599, 'remise' => '15'),
	array('article'=>'article F', 'prix' => 699, 'remise' => '75'),
);
?>
Tableau non trié :<br />
<table border="1">
	<tr>
		<td>Article</td><td>Prix</td><td>Remise</td>
	</tr>
<?php
	foreach($tableau as $produit) {
		echo '<tr>';
		echo '<td>'.$produit['article'].'</td><td>'.$produit['prix'].'</td><td>'.$produit['remise'].'</td>';
		echo '</tr>';
	}
	
?>
</table>
<br /> <br />
Tableau trié sur la remise :<br />
<table border="1">
	<tr>
		<td>Article</td><td>Prix</td><td>Remise</td>
	</tr>
<?php
	// Obtient une liste de colonnes
	foreach ($tableau as $key => $row) {
	    $article[$key]  = $row['article'];
	    $prix[$key] = $row['prix'];
		$remise[$key] = $row['remise'];
	}
	$tableau_trie = array_multisort($remise, SORT_DESC, $tableau);
	foreach($tableau as $produit) {
		echo '<tr>';
		echo '<td>'.$produit['article'].'</td><td>'.$produit['prix'].'</td><td>'.$produit['remise'].'</td>';
		echo '</tr>';
	}
?>
</table>
Avant de reprendre ce code, essaie de regarder l'exemple et de faire toi-même, ce n'est pas si compliqué et bien expliqué.

Eléphanteau du PHP | 20 Messages

07 avr. 2008, 19:12

Oui je l'avais vu aussi et c'est d'ailleurs celui que j'ai le plus testé hier soir et dont je parle dans mon message de 15h16 (j'avais recopié le code modifié). Seulement j'ai pas réussi à l'appliquer à mon script... :oops:

C'est pas si évident que ca quand on débute, on a vite fait de mélanger les données qu'il faut mettre, ou les mettre etc... J'espère que j'arriverais plus facilement avec celui que tu m'as donné.


Ce que je ne comprends pas du tout c'est cette première partie :
<?php 
$tableau = array( 
    // tri attendu suivant la remise : F, B, D, A, E, C 
    array('article'=>'article A', 'prix' => 199, 'remise' => '20'), 
    array('article'=>'article B', 'prix' => 299, 'remise' => '50'), 
    array('article'=>'article C', 'prix' => 399, 'remise' => '10'), 
    array('article'=>'article D', 'prix' => 499, 'remise' => '40'), 
    array('article'=>'article E', 'prix' => 599, 'remise' => '15'), 
    array('article'=>'article F', 'prix' => 699, 'remise' => '75'), 
); 
?>

Dans ce tableau les données semblent déjà renseignées alors que moi je veux afficher les données triées par ma requète. Donc ca colle pas du tout, je comprends pas la logique. Je ne peux pas renseigner les valeurs de ce tableau étant donné que je ne les connais pas. Il faut peut etre que je mette la variable à la place, par exemple $data['article'] ? :-k

Je vais essayer ca, et d'autres dispositions si ca ne fonctionne pas...


merci d'avoir pris le temps de modifier cet exemple pour l'appliquer à mon script, je vais regarder ca ce soir !

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

08 avr. 2008, 10:35

Bah cette partie c'est juste pour créer un tableau de test, moi je ne l'ai pas ta base faut bien que je me débrouille autrement :)

Mais si je ne m'abuse tu dois obtenir le même genre de tableau, "prix" et "article" récupérés en base, et "remise" calculée ensuite.

Eléphanteau du PHP | 20 Messages

08 avr. 2008, 15:42

J'ai eu quelques soucis à intégrer ton tableau trié à mon script parce que l'affichage était corrompu mais ca venait des balises <table> que j'avais mal placées.

Donc c'est réglé lorsque j'insère ton code dans mon script ca fonctionne bien, le tableau trié s'affiche (j'ai enlevé le non trié par souci de clarté). En revanche dès que je modifie les valeurs de l'array ca ne fonctionne plus.


Pour remplacer les valeurs de l'array par les données que je récupère dans ma requète j'ai mis ca :
$tableau = array( 
    array('articles'=>$data['article'], 'remise' => $res), 
); 

A la place de ce que tu avais mis pour ton exemple :
<?php  
$tableau = array(  
    // tri attendu suivant la remise : F, B, D, A, E, C  
    array('article'=>'article A', 'prix' => 199, 'remise' => '20'),  
    array('article'=>'article B', 'prix' => 299, 'remise' => '50'),  
    array('article'=>'article C', 'prix' => 399, 'remise' => '10'),  
    array('article'=>'article D', 'prix' => 499, 'remise' => '40'),  
    array('article'=>'article E', 'prix' => 599, 'remise' => '15'),  
    array('article'=>'article F', 'prix' => 699, 'remise' => '75'),  
);  
?>

Le problème c'est qu'avec mon array modifié tel que je l'ai mis juste au dessus, il me créé un tableau pour chaque valeur de la requète au lieu de toutes les regrouper dans un seul tableau.

Donc à priori si j'arrive à remplir correctement l'array pour qu'il regroupe toutes les réponses de la requète dans un même tableau ca sera bon mais je ne vois pas trop quoi mettre d'autre...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

08 avr. 2008, 16:43

Il faut que tu insères les manipulations dans ton propre code, de sorte à obtenir à la fin un tableau, qui contient lui-même d'autres tableaux, un pour chaque article (avec prix et remise)

Voici une suggestion :

$sql = "SELECT * FROM calcul WHERE min <= $prix AND max >= $prix'"; 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());   


$num_rows = mysql_num_rows($req); 
if($num_rows == 0) { 
	echo "<b><center>Désolé, il n'y a aucune réponse pour cette somme.</center></b>"; 
} else {
	while($data = mysql_fetch_assoc($req)) {  
		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 crée une nouvelle colonne)
		$data['remise'] = $res;
		
		// stockage de ce tableau dans un autre qui servira pour le tri
		// les [] signifie qu'on l'ajoute aux autres tableaux déjà stockés dedans
		$tableau_articles[] = $data;
	}
}
echo '<pre>';
print_r($tableau_articles);
echo '</pre>';
Je n'ai rajouté que les deux lignes commentées.
Essaie et donne nous le résultat du print_r();

Eléphanteau du PHP | 20 Messages

08 avr. 2008, 19:28

Quel bazar pour trier un tableau, c'est fou :shock: :)

Par contre c'est intéressant les deux lignes que tu as rajouté, je ne savais pas qu'on pouvait faire ca.

La modif que tu as faite dans ton message précédent donne le résultat suivant :

Code : Tout sélectionner

Array ( [0] => Array ( "liste des données de ma requete $data" ) ) Array ( [1] => Array ( "liste des données de ma requete $data" ) etc... pour chaque ligne de ma requète $data jusqu'à ce qu'il ait fait le tour de la table liée à la requète.


donc j'ai bien compris
- qu'on a intégré la variable $res (qui correspond à la remise) au tableau $data.
- qu'on a inséré le tableau $data à un nouveau tableau $tableau_articles (bien que je ne vois pas trop l'interet puisque $data existe déjà et est identique).


J'ai compris qu'à ce stade j'ai une liste de tableaux triés pour chacune des réponses de ma requète. Il faut donc les incorporer dans un autre tableau qui triera ces "sous tableaux".

Ca avance ! :). Peut être en ajoutant après le tableau $produit une ligne du style
 $tableau_fin = array($produit['$articles'], $produit['remise'], SORT_DESC);

J'ai fait plusieurs essais mais ca n'a pas marché. Pour l'instant c'est ce qui me semble le plus logique, je réessaierai ce soir... :)

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphanteau du PHP | 20 Messages

08 avr. 2008, 19:56

Ou peut etre en ajoutant un truc dans ce style là après le tableau $produit (et en rajoutant la balise <table> quelque part) :
    $tableau_fin = array_multisort($produit['remise'], SORT_DESC, $produit); 
    foreach($produit as $tri) { 
        echo '<tr>'; 
        echo '<td>'.$tri['articles'].'</td> <td>'.$tri['remise'].'</td>'; 
        echo '</tr>'; 
    } 

Ca fonctionne pas non plus mais ca doit pas être si loin...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

08 avr. 2008, 23:35

- qu'on a inséré le tableau $data à un nouveau tableau $tableau_articles (bien que je ne vois pas trop l'interet puisque $data existe déjà et est identique).
Ben non justement, ils ne sont pas identiques. le $tableau_articles contient plusieurs tableaux $data. $tableau_articles est donc un tableau à plusieurs dimensions.

J'ai l'impression que tu n'as pas encore saisi ce que représentent les tableaux, et comment ils fonctionnent. Pas étonnant donc que le tri d'un tableau à plusieurs dimensions te semble compliqué.

Par exemple, tu me parles "d'incorporer la balise <table> quelquepart". <table> c'est du HTML, c'est juste pour l'affichage, c'était pour te montrer ce que cela donne visuellement. ça n'a rien à voir avec la manipulation de tes tableaux.

J'ai déjà fait ton code, avec juste un tableau statique qui simule ce que te renvoie ta requête SQL, ensuite je calcule les remises, et les trie. Mais je ne crois pas qu'ils soit utile que je te le donne sans que tu n'ais compris les bases.

Je t'ai donné des bouts de code pour expliquer pas à pas, avec des commentaires, mais je n'ai pas l'impression que tu les ais exécutés. Je t'ai demandé plusieurs fois de me donner le résultat d'un print_r() sur un tableau, tu ne l'as jamais fait. Par exemple pour qu'on voit de façon "structurée" (visuellement) ce que tu récupères comme données après ta requête.

Je veux bien continuer à t'expliquer les choses, et repasser dessus, mais on va perdre notre temps tous les deux si tu ne fais pas ce que je te dis.
Donc je te propose que tu reprennes mes messages, que tu exécutes le code, fasse ce que je te demande, essaies de comprendre en allant lire la doc, et qu'éventuellement tu me poses des questions précises sur l'utilité de telle ou telle ligne. Comme ça on avancera et tu comprendras ce que tu auras fait.

Eléphanteau du PHP | 20 Messages

09 avr. 2008, 01:04

J'ai mis le résultat du print_r dans mon message au dessus mais je ne l'ai pas détaillé car ca prenait beaucoup de place et ca ne sert pas réellement pour continuer. Je pensais que tu voulais juste me faire visualiser le résultat afin que je comprenne mieux. D'ailleurs ca a été le cas, j'ai l'impression que c'est un peu plus clair tout de même, au moins qu'il faut d'abord trier les résultats de la requète dans des tableaux puis englober le tout dans un autre tableau trié. Reste à trouver comment faire.

Je t'assure que j'ai vraiment bien regardé tous les codes que tu m'as donné et réfléchi à tes commentaires, plus qu'en détail puisque je les ai tous triturés dans tous les sens en espérant trouver la solution par moi même. Idem pour le manuel php, j'ai même essayé chacun des exemples un à un sur mon script l'un après l'autre ainsi que certains des codes donnés dans les commentaires et même en cherchant ailleurs.

C'est certain que j'ai pas du saisir en revanche si je galère comme ca et que ca n'est pas compliqué. Ca fait 3 jours que je passe 4 ou 5 heures dessus, j'avais déjà cherché pendant 1 journée avant de poster mon message mais c'est vraiment pas simple quand on commence. Il y a 1001 facons de faire une erreur et "une" seule pour que ca marche. Malgré ton aide, c'est loin d'être évident de savoir vers quoi me diriger, comment le mettre en place, éviter les erreurs. Si ca se trouve avec tout ce que j'ai fait, je suis passé juste à coté à un moment mais une erreur quelconque à fait que ca n'a pas marché.

J'ai peut etre aussi passé un peu trop de temps là dessus. Là je suis un peu découragé que ca soit aussi compliqué d'arriver au bout. Je vais laisser tomber ca pour l'instant et j'y reviendrais peut etre dans quelques jours en essayant de reprendre ca depuis le début.

En tout cas je te remercie d'avoir pris le temps de me répondre et de me donner des pistes à chaque fois pour me faire avancer. J'aurais préféré te "récompenser" en trouvant mais là c'est décourageant d'y avoir passé autant de temps sans résultat.

Je ne souhaite pas le code tout fait, j'essaierai de le trouver quand la motivation sera revenue. Merci quand même pour ton aide.