Tri sur une colonne d'un array multidimensionnel

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tri sur une colonne d'un array multidimensionnel

Re: Tri sur une colonne d'un array multidimensionnel

par Aureusms » 20 janv. 2010, 12:17

OK.
++.

Re: Tri sur une colonne d'un array multidimensionnel

par dread » 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.

Re: Tri sur une colonne d'un array multidimensionnel

par Aureusms » 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];
   ...
   }
}

Tri sur une colonne d'un array multidimensionnel

par dread » 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.