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 selon une colonne


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 126
    Points : 57
    Points
    57
    Par défaut Trier un tableau selon une colonne
    Bonjour,

    je me tue à trier un tableau de plusieurs centaines de lignes dont le code d'encapsulation est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableau[] = array($distance_gps->description, $distance_gps->name, $h);
    et voici un extrait en print_r:

    Array ( 
    [0] => Array ( [0] => 01033002 [1] => BELLEGARDE [2] => 312.7362 ) 
    [1] => Array ( [0] => 01089001 [1] => AMBERIEU [2] => 286.4661 ) 
    [2] => Array ( [0] => 01185004 [1] => HAUTEVILLE [2] => 294.8129 ) 
    )
    je souhaite trier le tableau selon la troisième colonne (312.7362, 286.4661, 294.8129) du plus petit au plus grand et en ressortir les 3 plus petites valeurs associées $tableau[$u][0], $tableau[$u][1] et $tableau[$u][2]

    Je n'y arrive pas avec array_multisort ou même du basique php en if!!
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    $nblignestableau = count ( $tableau );
    $u = 0;
    $v = 10000;
    $w = 10000;
     
    while($u < $nblignestableau){
         if($tableau[$u][2] < $v){
            $k = $w;
            $w = $v;
            $v = $tableau[$u][2];
            $x1 = $tableau[$u][0];
            $y1 = $tableau[$u][1];
            $z1 = $tableau[$u][2];                
         }elseif($tableau[$u][2] < $w){
            $k = $w;     
            $w = $tableau[$u][2];
            $x2 = $tableau[$u][0];
            $y2 = $tableau[$u][1];
            $z2 = $tableau[$u][2];     
         }elseif($tableau[$u][2] < $k){
            $k = $tableau[$u][2];      
            $x3 = $tableau[$u][0];
            $y3 = $tableau[$u][1];
            $z3 = $tableau[$u][2];     
        };
        $u = $u + 1;
      };
    echo "$x1 - $y1 - $z1 <br><br>";
    echo "$x2 - $y2 - $z2 <br><br>";
    echo "$x3 - $y3 - $z3 <br><br>";
    celui ci m'affiche
    34154001 - MONTPELLIER - 8.7669
    30132004 - LA GRAND COMBE - 76.2123
    34337001 - VILLENEUVE-LES-MAG - 16.5258
    la première et troisième valeur sont corrects mais pas la seconde qui devrait être 34151005 - MARSILLARGUES - 11.5652. Je n'y comprend rien!!!!

    Merci pour votre aide!

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    Utilise usort( ).

    Sinon tes données viennent d'où ? Base de données ?

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    Je n'y arrive pas avec array_multisort
    J'ajoute que pour utiliser array_multisort( ) il faut que tes "colonnes" soit chacune un tableau passé en paramètre à array_multisort( ). C'est possible après un traitement intermédiaire.

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    Citation Envoyé par Séb. Voir le message
    J'ajoute que pour utiliser array_multisort( ) il faut que tes "colonnes" soit chacune un tableau passé en paramètre à array_multisort( ). C'est possible après un traitement intermédiaire.
    seb
    Il suffit d'aller voir la documentation php, on trouve bien assez d'exemples ou mieux: regarder dans la FAQ PHP ici (merci jreaux62 pour l'info)

  5. #5
    Invité
    Invité(e)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Bonjour!

    Quel défoulement!

    Je suis navré, je dois surement être stupide mais j'ai bien vu cet exemple avant de poster.
    Je ne le comprends pas et n'arrive pas à le mettre en pratique, notamment dans mon cas!

    que sont $a et $b, les valeurs de chaque colonne, mais comment les récupérer?!

    Merci!

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par josse34 Voir le message
    Quel défoulement! Je suis navré, je dois surement être stupide mais j'ai bien vu cet exemple avant de poster
    Je ne le comprends pas et n'arrive pas à le mettre en pratique, notamment dans mon cas!
    que sont $a et $b, quelles sont leur valeurs initiales?
    Les exemples de la FAQ sont, comment dire, ..., hum non, je ne dirais rien. Oublie la FAQ pour ce coup-là.

    usort( ) permet de trier un tableau selon tes propres critères. $a et $b représentent 2 éléments quelconques de ton tableau. Le cas échéant $a et $b sont des tableaux puisque tu as un tableau de tableaux. À toi de dire lequel est le plus grand/petit en retournant -1, 1 ou 0 s'ils sont égaux.

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    avec usort()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Array ( 
    [0] => Array ( [0] => 01033002 [1] => BELLEGARDE [2] => 312.7362 ) 
    [1] => Array ( [0] => 01089001 [1] => AMBERIEU [2] => 286.4661 ) 
    [2] => Array ( [0] => 01185004 [1] => HAUTEVILLE [2] => 294.8129 ) 
    )
    $a et $b correspondent a une ligne dans le tableau (3 lignes(villes) ici, pour toi)

    donc pour toi tu compares simplement $a[2] à $b[2]

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Vous êtes tous extrêmement gentils de répondre sur mon post et donc de sacrifier de votre temps, cependant, soyez un peu indulgents, ce n'est pas mon métier moi et certainement que dans un autre domaine je pourrais vous tenir le même discours. Le forum est fait pour cela et tout n'est pas dans les livres! Je n'attends pas un code tout fait à copier/coller mais un exemple complet et fonctionnel à adapter. C'est comme cela que je comprend mieux (et je ne dois pas être le seul!).
    D'ailleurs permettez moi de dire que dans cet exemple de FAQ, si en plus de l'explication point par point, il y avait le code complet, ça serait selon moi bien mieux!
    cool!

    Merci Papajoker, mais comparer deux lignes dans un tableau de 3 lignes c'est simple, ce que je recherche c'est vraiment une fonction PHP plus efficace pour trier en une seule fois un tableau pour n'en ressortir simplement que les 3 plus petites,.
    Peut être ais je mal compris mais je ne vois pas cela dans l'exemple, mon code de newbies ci-dessous très basique et moche fonctionne sauf sur la seconde valeur (et je ne comprends pas pourquoi!) la ou je n'arrive pas à obtenir de résultat avec les fonctions.
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    $nblignestableau = count ( $tableau );
    $u = 0;
    $v = 10000;
    $w = 10000;
     
    while($u < $nblignestableau){
         if($tableau[$u][2] < $v){
            $k = $w;
            $w = $v;
            $v = $tableau[$u][2];
            $x1 = $tableau[$u][0];
            $y1 = $tableau[$u][1];
            $z1 = $tableau[$u][2];                
         }elseif($tableau[$u][2] < $w){
            $k = $w;     
            $w = $tableau[$u][2];
            $x2 = $tableau[$u][0];
            $y2 = $tableau[$u][1];
            $z2 = $tableau[$u][2];     
         }elseif($tableau[$u][2] < $k){
            $k = $tableau[$u][2];      
            $x3 = $tableau[$u][0];
            $y3 = $tableau[$u][1];
            $z3 = $tableau[$u][2];     
        };
        $u = $u + 1;
      };
    echo "$x1 - $y1 - $z1 <br><br>";
    echo "$x2 - $y2 - $z2 <br><br>";
    echo "$x3 - $y3 - $z3 <br><br>";
    34154001 - MONTPELLIER - 8.7669
    30132004 - LA GRAND COMBE - 76.2123
    34337001 - VILLENEUVE-LES-MAG - 16.5258
    La seconde valeur devrait être 34151005 - MARSILLARGUES - 11.5652

    GRAND Merci!!!!!!!

  10. #10
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    comparer deux lignes dans un tableau de 3 lignes c'est simple, ce que je recherche c'est vraiment une fonction PHP plus efficace pour trier en une seule fois un tableau pour n'en ressortir simplement que les 3 plus petites
    Il faut utiliser usort( ). As-tu été voir la doc ? Il y a des exemples : http://fr.php.net/usort

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Il faut utiliser usort( ). As-tu été voir la doc ? Il y a des exemples : http://fr.php.net/usort
    Merci Seb, je vais essayer de mettre en pratique notamment sur la base des exemples 2 et 4.
    Je reviens!

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    et tout le code est présent dans la faq :

    "Deuxième fonction de tri sur le troisième élément :
    "
    http://php.developpez.com/faq/?page=...ab_trimultidim

    une fois trié,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableau = array_slice($tableau, 0, 3);

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Bon admettons cet exemple, je reprend la FAQ, vous allez hurler de rire mais je ne sais pas quoi metre à $a et $b entre autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $tab = array(array(5,6,2),array(3,7,1),array(1,5,9),array(3,8,8),array(1,2,3),array(7,4,4),array(4,2,10));
    usort($tab, "cmp2");
    $tab = array_slice($tab, 0, 3);
     
    function cmp2($a,$b) {
        if ($a[2] == $b[2])
            return 0;
        return ($a[2] > $b[2]) ? -1 : 1;
    }

  14. #14
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    Citation Envoyé par josse34 Voir le message
    quoi metre à $a et $b
    rien !
    $a c'est une ligne
    $a[2] c'est la 3eme colonne

    ici dans le code tu compares les 3eme colonnes pour chaque ligne du tableau
    et toi tu as un tableau sur 3colonnes
    ps: il faut peut-etre inverser la condition dans cmp2() > ou < ...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    OH PUTA*N je viens de comprendre!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Rooohhhhh la vache, j'ai eu du mal sur ce coup la!!!!
    Ce code donc :
    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
     
    <?php
    $tab = array(array(5,6,2),array(3,7,1),array(1,5,9),array(3,8,8),array(1,2,3),array(7,4,4),array(4,2,10));
     
    usort($tab, "cmp2");
     
    $tab = array_slice($tab, 0, 3);
     
    print_r($tab);
     
    function cmp2($a,$b) {
        if ($a[2] == $b[2])
            return 0;
        return ($a[2] < $b[2]) ? -1 : 1;
    }
    ?>
    donne :
    /*Array (
    [0] => Array (
    [0] => 4
    [1] => 2
    [2] => 10
    )
    [1] => Array (
    [0] => 1
    [1] => 5
    [2] => 9
    )
    [2] => Array (
    [0] => 3
    [1] => 8
    [2] => 8
    )
    )*/
    La clef [2] étant en ordre décroissant (10 puis 9 puis 8)!!!

    Merveilleux!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Encore une fois, grand merci PapaJoker, tu es un prince!!!!!!!!!!!!!
    Merci également à Seb!

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

Discussions similaires

  1. [MySQL] Trier un tableau associatif selon une colonne
    Par okoweb dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/10/2011, 19h33
  2. Trier selon une colonne et à partir de la 3eme ligne
    Par manu f dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/07/2010, 20h18
  3. Trier selon une colonne masquée
    Par michaeljeru dans le forum jQuery
    Réponses: 1
    Dernier message: 16/05/2010, 01h01
  4. ordonner un tableau associatif selon une colonne
    Par hoolako dans le forum PL/SQL
    Réponses: 4
    Dernier message: 10/03/2010, 18h43
  5. [debutant][JTable] Trier selon une colonne
    Par yupa dans le forum Composants
    Réponses: 3
    Dernier message: 08/08/2005, 11h05

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