Tri sur une colonne d'un array multidimensionnel

Eléphant du PHP | 186 Messages

20 janv. 2010, 10:22

Bonjour à tout le monde et bonne année 2010.

Je viens vers vous avec une demande portant sur le tri d'une colonne dans un tableau multidimensionnel.

J'ai un tableau qui répertorie l'id, la date de création, le nom, le prénom, la société, le groupe, la ville, le code postal et le pays d'une personne.

J'aurais voulu qu'au clic sur les en-têtes de ce tableau, les résultats soient triés. Pour faire court, je clique sur l'en tête de colonne "nom" et toutes les résultats des personnes sont triés par ordre alphabétique croissant puis si je reclique encore sur nom, tous les résultats sont triés par ordre alpha décroissant. Le tri peut aussi s'opérer sur des données numériques telles que la date de création.

Je tiens à préciser que je ne peux pas faire de ORDER BY au niveau des requêtes pour effectuer les tris.

Voici la structure de tableau que j'utilise habituellement:
$a_afficher=array();
$a_afficher[$j]['id']=$row_info_client['id_client'];
$a_afficher[$j]['date']=$row_info_client['date_client'];
$a_afficher[$j]['nom']=$row_info_client['nom_client'];
$a_afficher[$j]['prenom']=$row_info_client['prenom_client'];
$a_afficher[$j]['societe']=$row_info_client['societe_client'];
$a_afficher[$j]['groupe']=$row_groupe['nom_groupe'];
$a_afficher[$j]['ville']=$row_info_client['ville_client'];
$a_afficher[$j]['cp']=$row_info_client['cp_client'];
$a_afficher[$j]['pays']=$row_info_client['nom_pays'];
J'ai trouvé certains éléments parlant du multisort ou du asort mais je n'arrive pas concrètement à l'appliquer à mon cas.

Merci par avance pour toute aide apportée.

ViPHP
ViPHP | 1996 Messages

20 janv. 2010, 10:39

Si tu ne peux pas faire d'"ORDER BY" c'est bête...
Sinon tu peux générer 9 tableaux pour chaque colonne qui aura&ont la même clef. Tu récupères la colonne triée via un lien en GET (genre GET["COLONNE"] =NOM_ASC").
Tu tries le tableau avec asort() qui conservera la correspondance avec les clef et tu affiches le tout, ce qui pourrais donner :
<?php
if (isset($_GET["COLONNE"]) && !empty($_GET["COLONNE"]))
{
  $colonne_a_trier = $_GET["COLONNE"];
  switch ($colonne_a_trier)
  {
  default:
  case "NOM_FR":
  asort($tableau_nom);
  $tableau_maitre = $tableau_nom;
  break;

  case ...
  break;
  }
}

if (!isset($tableau_maitre)) //pas de tri ...
{
  a toi de remplir
else
{
  foreach ($tableau_maitre as $cle => $valeur)
  {
   echo $tableau_nom[$cle];
   echo $tableau_date[$cle];
   ...
   }
}
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 186 Messages

20 janv. 2010, 11:18

Merci Aureusms pour ta réponse.
J'avais effectivement trouvé une réponse similaire à la tienne mais il faut croire que cette fois le déclic s'est produit.

Par contre j'ai dû changer un peu la structure de mon tableau pour celle ci:
$a_afficher['id'][$j]=$row_info_client['id_client'];
$a_afficher['date'][$j]=$row_info_client['date_client'];
$a_afficher['nom'][$j]=$row_info_client['nom_client'];
$a_afficher['prenom'][$j]=$row_info_client['prenom_client'];
$a_afficher['societe'][$j]=$row_info_client['societe_client'];
$a_afficher['groupe'][$j]=$row_groupe['nom_groupe'];
$a_afficher['ville'][$j]=$row_info_client['ville_client'];
$a_afficher['cp'][$j]=$row_info_client['cp_client'];
$a_afficher['pays'][$j]=$row_info_client['nom_pays'];
Et ensuite, j'enregistre les valeurs envoyées en GET depuis mes liens sur mes en-têtes de tableau:
$tri=$_GET['tri']; //qui correspond au nom d'une de mes colonnes de tableau. ex:nom, prenom, etc...
$ordre=$_GET['ordre']; //qui peut prendre comme valeur ASC ou DESC
Je n'ai plus qu'à définir la fonction de tri à utiliser en fonction de ASC ou DESC:
if($ordre=='DESC'){
arsort($a_afficher[$tri]);
} else {
asort($a_afficher[$tri]);
}
Et enfin, la suite de la solution que tu m'as donné et qui permet l'affichage de mes résultats selon le critère de tri et l'ordre souhaité:
foreach ($a_afficher[$tri] as $cle => $valeur){
  
$dateheure_fr=dateheure_fr($a_afficher['date'][$cle]);
echo '
<tr>
<td class="titre">'.$dateheure_fr.'</td>
<td class="titre">'.$a_afficher['nom'][$cle].'</td>
<td class="titre">'.$a_afficher['prenom'][$cle].'</td>
<td class="titre">'.$a_afficher['societe'][$cle].'</td>
<td class="titre">'.$a_afficher['groupe'][$cle].'</td>
<td class="titre">'.$a_afficher['ville'][$cle].'</td>
<td class="titre">'.$a_afficher['cp'][$cle].'</td>
<td class="titre">'.$a_afficher['pays'][$cle].'</td>
...
}
Merci encore pour l'aide apportée. J'espère que le code que j'ai mis pourra en aider d'autres.
A plus et bonne continuation.

ViPHP
ViPHP | 1996 Messages

20 janv. 2010, 12:17

OK.
++.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr