Aller au contenu

Problème de tri de tableau


Théo B.

Sujets conseillés

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 :

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)
2) tu testes tes différentes moyennes, tu tries les éléments de ton tableau php en fonction

<{POST_SNAPBACK}>

Justement.

Comment le faire ? :)

(Sachant que je ne peux pas mettre ma moyenne en clé vu qu'il peut exister des moyennes égales)

Modifié par Théo B.
Lien vers le commentaire
Partager sur d’autres sites

Une solution simple est de mettre ton calcul de moyenne dans ta requete SQL.

exemple:

$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";

Modifié par rportal
Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)
Une solution simple est de mettre ton calcul de moyenne dans ta requete SQL.

exemple:

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;
}
}

Modifié par Théo B.
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...