Aller au contenu

Tri multi-dimensionnel


MarvinLeRouge

Sujets conseillés

Salut,

J'ai récupéré un paquer de données provenant d'une base de données dans un tableau : une ligne de données récupérée par mysql_fetch_assoc directement ajoutée au tableau en question. J'ai donc un tableau dont chaque ligne est un tableau associatif.

Les clés de ces lignes contiennent notamment date, theme et titre.

Je voudrais pouvoir trier l'ensemble du tableau d'un coup, par (date décroissante, titre croissant), puis par (theme croissant, titre croissant).

J'ai regardé du côté des fonctions de tri de tableaux, mais l'utilisation de array_multisort dans ce cas ne me parait pas évidente du tout.

Quelqu'un pourrait m'aider, svp ?

Merci

PS : Chti bout de code pour éclaircir la chose

$tabData = array ();
while ($lineData = mysql_fetch_assoc ($resultSql))
{
 array_push ($tabData, $lineData);
}

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

Salut ;)

Il ne serait pas plus judicieux de trier dès la requète SQL ?

Il me semble plus judicieux de faire ça plutôt qu'en PHP... Une étape au lieu de deux lol

Lien vers le commentaire
Partager sur d’autres sites

Ben non justement :

Je dois traiter 2 fois les mêmes données dans ma page, suivant 2 tris différents. Donc, si je voulais le faire en sql, ça impliquerait de faire 2 requètes, pour récupérer un seul paquet de données, ce qui est aberrant.

C'est pour ça que je cherche à trier en php.

Lien vers le commentaire
Partager sur d’autres sites

Utilises des tableaux pour stocker les valeurs :

$tabTheme = array ();
$tabTitre = array ();
$tabDate = array ();
while ($lineData = mysql_fetch_object ($resultSql))
{
array_push ($tabTheme , $lineData->theme);
array_push ($tabTitre , $lineData->titre);
array_push ($tabDate , $lineData->date);
}

Puis utilises array_multisort.

Lien vers le commentaire
Partager sur d’autres sites

Ce qui obligerait à créer autant de tableaux qu'il y a de colonnes dans la requète aïe aïe aïe

Quelqu'un aurait une autre idée (comme la façon de faire marcher usort dans un objet par exemple) ?

Lien vers le commentaire
Partager sur d’autres sites

Personnellement, je ferais 2 requètes. Que tu fasses le tri en php ou en mysql, ca revient au même, tu récupères les résultats. D'un certain coté, comme tu dis, il faut mieux éviter 2 requètes là où 1 est suffisante. D'un autre coté, mysql est plus rapide que php, et tu n'y gagnerais pas forcément grand chose à le faire en php..

Ceci dit, je m'y suis collé, et ca donne ceci :

$tabData[0]['date'] = "10";
$tabData[0]['theme'] = "100";
$tabData[0]['titre'] = "1000";

$tabData[2]['date'] = "1000";
$tabData[2]['theme'] = "10";
$tabData[2]['titre']= "100";

$tabData[3]['date']= "100";
$tabData[3]['theme'] = "1000";
$tabData[3]['titre'] = "10";

$tabData[4]['date']= "100";
$tabData[4]['theme'] = "100";
$tabData[4]['titre'] = "10";

$tabData[5]['date']= "15";
$tabData[5]['theme'] = "100";
$tabData[5]['titre'] = "15";

$tabData[6]['date']= "5";
$tabData[6]['theme'] = "100";
$tabData[6]['titre'] = "5";


function compare($a,$b){
GLOBAL $tabData,$cle,$ord;
if ($tabData[$a][$cle]==$tabData[$b][$cle])
   return($tabData[$a]['titre'] > $tabData[$b]['titre'])?1:-1;

if ($ord=="desc")
   return ($tabData[$a][$cle] > $tabData[$b][$cle]) ? -1 : 1;
else
   return ($tabData[$a][$cle] < $tabData[$b][$cle]) ? -1 : 1;
}




$cle="theme";
$ord="desc";
uksort($tabData,"compare");

foreach($tabData as $k => $v)echo"<br>".$k."-->".$v[$cle]. " <br> ".$v['titre'];

Un p'tit peu d'explications.

le tableau tout en haut, c'est pour te montrer qu'apparemment ca marche.

Le tri sur le 'titre' se fait automatiquement.

Ensuite, tu peux trier sur le theme, ou sur la date, que j'ai mis en variable $cle. Tu modifies cette variable, ca modifiera le tri.

Pour l'ordre, c'est idem. une variable $ord, que tu mets à 'desc', ou 'asc', comme tu veux.

Si ca bugge, ben.. je suis là ;)

Anonymus.

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...