IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Trier un tableau multidimensionnel


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 684
    Points : 153
    Points
    153
    Par défaut Trier un tableau multidimensionnel
    Bonsoir à tous,

    Après des pages de lecture, je n'ai pas trouvé de solution

    j'ai un tableau multidimensionnel composé comme suit :

    Col 1=age, col 2=ville, col 3=nom

    20, v3, n5
    20, v2, n3
    20, v6, n2
    ...
    21, v1, n2
    21, v5, n4
    21, v5, n3
    ...
    22, v1, n3
    22, v5, n2
    22, v5, n1

    Je voudrais trier ce tableau sur la colonne 3 (nom)
    mais, je voudrais garder le classement de la colonne 1

    Bien sur, la col 2 doit suivre le tri de la col 3

    si vous avez une idée

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Hello,

    array_multisort doit faire ça normalement (mais j'ai jamais cherché à m'en servir ). Sinon usort() est ton ami.

    Avec usort() tu peux "hiérarchiser" les critères de tri dans ta fonction de comparaison. Dans ton cas de figure, un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function compare( $a , $b ){
    $out = 0;    
    $out = strcasecmp( $a['nom'] , $b['nom'] ) < 0 ? -2 : 2;
    $out +=  $a['age'] < $b['age'] ? -1 : 1;
    return $out;
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 684
    Points : 153
    Points
    153
    Par défaut
    Bonsoir Petibidon,

    Mais mon tableau est déclaré comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $j=0; $i=0; $k=0; $h=0;
    while ($i<100)
    	{
    	 for ( $u=0; $u<8; $u++ )
    		 {
    		  $tab_f[$i][$j]="";
    		  $j++; $h++;
    		 }
    	 $j=0; $k=$k+2; $h++;
    	 $i=$i+1;
    	}
    Comment adapter ton code ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut

    Merci, tu viens de me faire une entorse au cerveau.

    essaye de donner quelques lignes du tableau généré s'il te plait, ça fera moins mal

    [aparte]
    Je viens de penser que dans la fonction proposée au dessus, il faut au moins prendre en compte l'égalité parfaite pour le critère principal sinon le tri risque d'être faussé.
    [/aparte]

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 684
    Points : 153
    Points
    153
    Par défaut
    Je n'ai pas actuellement la possibilité d'éditer
    le source généré.

    Par contre, voici comment je lit le tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    for ($i=0; $i<150; $i++);  
    	{
    	 for ($j=0; $j<150; $j++) 
    		 {
    		  # Teste si le N° d'arrivée est numérique
    		  if (preg_match('#^[0-9,\s\.-]+$#', $tab_f[$j][1])) //{ echo 'pas bon'; }
    			 {
    		  if ( $tab_f[$j][3] <> "" )
    			 {
    			  echo '<tr>';
    				 echo '<td width="14" align="center">'.$tab_f[$j][0].'</td>';   // Age
    				 echo '<td td width="110">'.$tab_f[$j][1].'</td>';		// Ville
    				 echo '<td width="120" align="center">'.$tab_f[$j][2].'</td>';   // Nom
    			  echo '</tr>':
    			  }
    		 }
    	}
    J'ai simplifié, car en réalité, le tableau comporte 18 colonnes.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    donc si je pige correctement, le nom c'est l'indice 2 et l'age, l'indice 0.

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function compare( $a , $b ){
    $out = 0;    
    $cr1 = strcasecmp( $a[2] , $b[2] );
    $out = $cr1 < 0 ? -2 : ( $cr1 == 0 ? 0 : 2 ); 
    $out +=  $a[0] < $b[0] ? -1 : 1;
    return $out;
    }

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 684
    Points : 153
    Points
    153
    Par défaut
    Désolé pour ton mal de tête !

    Comment appeler la fonction et avec quels paramètres ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Tant pis, tu me dois un aspro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    usort( $tab_f , 'compare' );

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 684
    Points : 153
    Points
    153
    Par défaut
    Je crois que nous allons faire moit-moit pour l'efféralgan...

    Je me suis complètement fourvoyé car j'ai confondu le
    tableau qui sert a écrire dans la base de données et
    la lecture de ce tableau de la base.

    Donc, le tri doit s'éffectuer a partir d'une table HTML.

    Pour résumer, j'affiche dans un premier temps la table
    comme je l'ai saisie et ensuite, la réafficher triée avec
    les critères que j'ai donnés.

    A ce niveau, il me semble que l'on sort du PHP ?

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 684
    Points : 153
    Points
    153
    Par défaut
    Bonsoir Petibidon,

    Merci pour tes bons conseils.

    J'ai finalement opté pour le JavaScript.
    et cela tourne bien.

    @ +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier un tableau() multidimensionnel
    Par Ravens dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 30/03/2013, 02h35
  2. Réponses: 15
    Dernier message: 18/05/2012, 13h15
  3. [PHP 5.2] Trier un tableau multidimensionnel ?
    Par nazoreen dans le forum Langage
    Réponses: 4
    Dernier message: 04/03/2009, 15h59
  4. [Tableaux] comment trier un tableau multidimensionnel
    Par tibotibo69 dans le forum Langage
    Réponses: 2
    Dernier message: 26/02/2008, 17h04
  5. [Tableaux] trier un tableau multidimensionnel
    Par chris801 dans le forum Langage
    Réponses: 2
    Dernier message: 08/06/2007, 08h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo