Version complète: sur le forum Webmaster Hub : Problème de tri de tableau
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Théo B.
Bonjour,

Je souhaite créer un système de notation, qui prend en compte divers critères.
Les coefficients et critères pouvant etre modifiés par l'utilisateur, la moyenne doit etre calculée à chaque execution, en fonction de l'utilisateur.
Mon problème réside dans le tri du tableau : comment faire pour sortir en premier le tableau contenant les notes qui a la plus haute moyenne ?

Voici le code :
CODE
function CompareAll(){
$query=@mysql_query('SELECT * FROM `'.PREFIX.'table` ORDER BY id DESC');
$fetch=@mysql_fetch_array($query);
$i=0;
$buffer=array(0=>'', 1=>'', 2=>'');
while($content=@mysql_fetch_array($query)){
if(empty($_COOKIE['coefs'])){
$sum=$content['Mod']*1+$content['Them']*1+$content['Instal']*0.5+$content['Usab']*2+$content['Simpli']*2+$content['Res']*1.5+$content['Conn']*1;
$total=$sum/9;
$buffer[$i].='<h2>'.$content['title'].'</h2><table>
<tr>
<td>Modulabitlité : (1)</td>
<td>Themabilité : (1)</td>
<td>Installation : (0.5)</td>
<td>Usabilité : (2)</td>
<td>Simplicité : (2)</td>
<td>UtilisationRessources : (1.5)</td>
<td>Connaissances : (1)</td>
<td>Moyenne :</td>
</tr>
<tr>
<td>'.$content['Mod'].'</td>
<td>'.$content['Them'].'</td>
<td>'.$content['Instal'].'</td>
<td>'.$content['Usab'].'</td>
<td>'.$content['Simpli'].'</td>
<td>'.$content['Res'].'</td>
<td>'.$content['Conn'].'</td>
<td>'.round($total,2).'</td>
</tr>
</table><br />';
}
else
{
$coef = $_COOKIE['coefs'];
$coefunique = explode(";", $coef);
$sum=$content['Mod']*$coefunique[0]+$content['Them']*$coefunique[1]+$content['Instal']*$coefunique[2]+$content['Usab']*$coefunique[3]+$content['Simpli']*$coefunique[4]+$content['Res']*$coefunique[5]+$content['Conn']*$coefunique[6];
$total=$sum/($coefunique[0]+$coefunique[1]+$coefunique[2]+$coefunique[3]+$coefunique[4]+$coefunique[5]+$coefunique[6]);
$buffer[$i].='<h2>'.$content['title'].'</h2><table>
<tr>
<td>Modulabitlité : ('.$coefunique[0].')</td>
<td>Themabilité : ('.$coefunique[1].')</td>
<td>Installation : ('.$coefunique[2].')</td>
<td>Usabilité : ('.$coefunique[3].')</td>
<td>Simplicité : ('.$coefunique[4].')</td>
<td>UtilisationRessources : ('.$coefunique[5].')</td>
<td>Connaissances : ('.$coefunique[6].')</td>
<td>Moyenne :</td>
</tr>
<tr>
<td>'.$content['Mod'].'</td>
<td>'.$content['Them'].'</td>
<td>'.$content['Instal'].'</td>
<td>'.$content['Usab'].'</td>
<td>'.$content['Simpli'].'</td>
<td>'.$content['Res'].'</td>
<td>'.$content['Conn'].'</td>
<td>'.round($total,2).'</td>
</tr>
</table><br />';
}
$i++;
}
foreach($buffer as $key=>$content){
echo $content;
}
}


Ici, c'est la deuxieme partie du code qui importe.
La "clé" avec laquelle j'aimerai trier le tableau est donc round($total,2).

Merci.
MarvinLeRouge
Salut,

Proposition (à condition que j'ai bien compris la question) :
1) tu calcules tes différents tableaux html, que tu stockes dans des variables php
2) tu testes tes différentes moyennes, tu tries les éléments de ton tableau php en fonction
3) tu envoies dans le flux un implode des éléments de ton tableau php
Théo B.
CITATION(MarvinLeRouge @ lundi 27 mars 2006, 19h22)
2) tu testes tes différentes moyennes, tu tries les éléments de ton tableau php en fonction
*


Justement.
Comment le faire ? smile.gif
(Sachant que je ne peux pas mettre ma moyenne en clé vu qu'il peut exister des moyennes égales)
rportal
Une solution simple est de mettre ton calcul de moyenne dans ta requete SQL.

exemple:

CODE
$query="(Mod*{$coefunique[0]}+Them*{$coefunique[1]}+Instal*{$coefunique[2]}+Usab*{$coefunique[3]}+".
"Simpli*{$coefunique[4]}+Res*{$coefunique[5]}+Conn*{$coefunique[6]})" .
"/({$coefunique[0]}+{$coefunique[1]}+{$coefunique[2]}+{$coefunique[3]}+{$coefunique[4]}+{$coefunique[5]}+{$coefunique[6]}) As moyenne," .
" * FROM `".$PREFIX."table` ORDER BY moyenne DESC";
Théo B.
CITATION(rportal @ lundi 27 mars 2006, 20h15)
Une solution simple est de mettre ton calcul de moyenne dans ta requete SQL.

exemple:

CODE
$query="(Mod*{$coefunique[0]}+Them*{$coefunique[1]}+Instal*{$coefunique[2]}+Usab*{$coefunique[3]}+".
"Simpli*{$coefunique[4]}+Res*{$coefunique[5]}+Conn*{$coefunique[6]})" .
"/({$coefunique[0]}+{$coefunique[1]}+{$coefunique[2]}+{$coefunique[3]}+{$coefunique[4]}+{$coefunique[5]}+{$coefunique[6]}) As moyenne," .
" * FROM `".$PREFIX."table` ORDER BY moyenne DESC";

*


Le problème est que cette moyenne prend en compte les coefficients des cookies des utilisateurs si ils existent.
Les moyennes n'appartiennent donc pas à la table SQL...

//EDIT :
Résolu :
CODE
function CompareAll(){
$query=@mysql_query('SELECT * FROM `'.PREFIX.'table` ORDER BY id DESC');
$fetch=@mysql_fetch_array($query);
$i=0;
$buffer=array();
$buffer2=array();
while($content=@mysql_fetch_array($query)){
if(empty($_COOKIE['coefs'])){
$sum=$content['Mod']*1+$content['Them']*1+$content['Instal']*0.5+$content['Usab']*2+$content['Simpli']*2+$content['Res']*1.5+$content['Conn']*1;
$total=$sum/9;
@$buffer[$total]='<h2>'.$content['title'].'</h2><table>
<tr>
<td>Modulabitlité : (1)</td>
<td>Themabilité : (1)</td>
<td>Installation : (0.5)</td>
<td>Usabilité : (2)</td>
<td>Simplicité : (2)</td>
<td>UtilisationRessources : (1.5)</td>
<td>Connaissances : (1)</td>
<td>Moyenne :</td>
</tr>
<tr>
<td>'.$content['Mod'].'</td>
<td>'.$content['Them'].'</td>
<td>'.$content['Instal'].'</td>
<td>'.$content['Usab'].'</td>
<td>'.$content['Simpli'].'</td>
<td>'.$content['Res'].'</td>
<td>'.$content['Conn'].'</td>
<td>'.round($total,2).'</td>
</tr>
</table><br />';
}
else
{
$coef = $_COOKIE['coefs'];
$coefunique = explode(";", $coef);
$sum=$content['Mod']*$coefunique[0]+$content['Them']*$coefunique[1]+$content['Instal']*$coefunique[2]+$content['Usab']*$coefunique[3]+$content['Simpli']*$coefunique[4]+$content['Res']*$coefunique[5]+$content['Conn']*$coefunique[6];
$total=$sum/($coefunique[0]+$coefunique[1]+$coefunique[2]+$coefunique[3]+$coefunique[4]+$coefunique[5]+$coefunique[6]);
$buffer[$total]='<h2>'.$content['title'].'</h2><table>
<tr>
<td>Modulabitlité : ('.$coefunique[0].')</td>
<td>Themabilité : ('.$coefunique[1].')</td>
<td>Installation : ('.$coefunique[2].')</td>
<td>Usabilité : ('.$coefunique[3].')</td>
<td>Simplicité : ('.$coefunique[4].')</td>
<td>UtilisationRessources : ('.$coefunique[5].')</td>
<td>Connaissances : ('.$coefunique[6].')</td>
<td>Moyenne :</td>
</tr>
<tr>
<td>'.$content['Mod'].'</td>
<td>'.$content['Them'].'</td>
<td>'.$content['Instal'].'</td>
<td>'.$content['Usab'].'</td>
<td>'.$content['Simpli'].'</td>
<td>'.$content['Res'].'</td>
<td>'.$content['Conn'].'</td>
<td>'.round($total,2).'</td>
</tr>
</table><br />';
}
$i++;
}
ksort($buffer);
foreach ($buffer as $content) {
echo $content;
}
}
rportal
CITATION
Le problème est que cette moyenne prend en compte les coefficients des cookies des utilisateurs si ils existent.
Les moyennes n'appartiennent donc pas à la table SQL...


oui j'avais bien vu. C'est pour cela que je t'avais proposé de calculer la moyenne dans la requete SQL car mySQL ou autre sait faire des operation arythmétique rapidement et aussi faire de l'ordonnencement sur des résultats. Les coefficients etant initialisés soit par les valeurs du cookies soit par les valeurs par défaut dans le php avant de construire la requete.

Mais bon tu as trouvé une solution, c'est l'essentiel.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.