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 :

[Tableaux] tri de tableau deux dimensions


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Points : 38
    Points
    38
    Par défaut [Tableaux] tri de tableau deux dimensions
    Bonjour,
    j'espose le problème :

    je récupère dans un tableau le résultat d'une requete sql sur une base de donnée. Mon tableau à cette structure:

    Array([0]=>Array([clé1]=>...
    [clé2]=>...
    ......
    [cléN]=>...)
    [1]=>Array(...)
    ...
    [P]=>Array(...))

    J'affiche ces données dans un tableau, les colonnes étant les clés (clé1, clé2, ..., cléN).
    Je voudrais trier ce tableau (à l'affichage) en faisant un clic sur l'intitulé de la colonne sur laquelle se fait le tri. Le clic provoque un rechargement de ma page avec les données triées.
    J'ai trouvé une solution un peu lourde ou je refais à chaque fois ma requete sql en mettant l'option Order by qui va bien.
    J'aimerais plutot passer mon tableau et la clé du trie au moment du rechargement de ma page et appliquer une fonction de tri au tableau avant de le réafficher.
    Le problème est que je ne trouve pas une fonction de trie qui me permettrait de faire ca.
    Elle existe surrement mais je n'ai pas trouvé. (ou alors je n'ai pas compris comment utiliser array_multisort ?).

    Est ce que quelqu'un peut me venir en aide, en esperant avoir été suffisament clair.

  2. #2
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    salut,
    utilises usort comme ca tu ecris ta methode tri
    http://fr2.php.net/usort
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    merci beaucoup, ca marche niquel comme ca

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    second problème:

    mon tableau peut se trier selon deux clés. Si je trie selon clé2, puis selon clé1, comment faire pour que les éléments soient triés selon clé1 en 1er niveau et selon clé2 en second niveau?
    Je précise que la seconde fois que je fais le tri, je le fais sur le tableau obtenue apres le premier tri.
    Pour le moment, seul le dernier tri demandé et pris en compte.
    ex de ce que je voudrais obtenir:

    clé1 clé2
    a a
    b a
    d c
    a d
    a b

    apres tri:

    clé1 clé2
    a a
    a b
    a d
    b a
    d c

    Voila la fonction de trie que j'utilise dans le usort:
    function tri_clé1($a, $b){
    if ($a[clé1]==$b[clé1])
    return 0;
    else
    return ($a[clé1] > $b[clé1]?1:-1);
    }

    idem pour tri clé2.

    Je peux développez un peu le contexte d'exécution au besoin.
    Merci.

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 043
    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 043
    Points : 8 075
    Points
    8 075
    Billets dans le blog
    17
    Par défaut
    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
    function mon_tri($a, $b) {
        if ( $a['clé1'] > $b['clé1'] ) {
            return 1 ;
        &#125; elseif &#40; $a&#91;'clé1'&#93; < $b&#91;'clé1'&#93; &#41; &#123;
            return -1 ;
        &#125; else &#123;
            if &#40; $a&#91;'clé2'&#93; > $b&#91;'clé2'&#93; &#41; &#123;
                return 1 ;
            &#125; elseif &#40; $a&#91;'clé2'&#93; < $b&#91;'clé2'&#93; &#41; &#125;
                return -1 ;
            &#125; else &#123;
                return 0 ;
            &#125;
        &#125;
    &#125;
    Non ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    bein si ,
    c'est marrant comme quand on a la solution devant les yeux on se trouve con de ne pas y avoir pensé avant
    Merci pour ton aide

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Il me semble avoir fait il y a quelque temps un benchmark sur les fonctions de tri de tableaux multi et j'ai le souvenir que array_multisort était le plus rapide (à confirmer).

    Voici à comment utiliser array_multisort:

    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
    $tableau = array&#40;
      array&#40;'nom'=>'Dupont', 'age'=>3&#41;,
      array&#40;'nom'=>'Arnaud', 'age'=>98&#41;,
      array&#40;'nom'=>'Arnaud', 'age'=>8&#41;,
      array&#40;'nom'=>'Zoé'   , 'age'=>1&#41;,
      array&#40;'nom'=>'Arnaud', 'age'=>10&#41;
    &#41;;
     
    // composition des clés de tri
    foreach&#40;$tableau as $k=>$v&#41;&#123;
      $nom&#91;$k&#93; = $v&#91;'nom'&#93;;
      $age&#91;$k&#93; = $v&#91;'age'&#93;;
    &#125;
     
    // pour trier sur une seule clé &#40;les clés suivantes sont triées en ASC par défaut&#41;
    array_multisort&#40;$nom, SORT_DESC, $tableau&#41;;
    Et, pour forcer les tris secondaires sur autre chose que l'ordre par défaut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // composition des clés de tri &#40;Attention il FAUT recomposer les clés après un premier array_multisort&#41;
    foreach&#40;$tableau as $k=>$v&#41;&#123;
      $nom&#91;$k&#93; = $v&#91;'nom'&#93;;
      $age&#91;$k&#93; = $v&#91;'age'&#93;;
    &#125;
     
    // tri principal sur une clé et secondaire sur une deuxième
    array_multisort&#40;$nom, SORT_ASC, $age, SORT_DESC, $tableau&#41;;
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Merci pour ton post,
    il me semblait bien qu'on pouvait utiliser array_mulitsort mais la doc n'est pas super claire à mon sens.
    Je vais essayer avec cette fonction la, ca va devrait alléger un peu mon code.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Entretemps j'ai refait un petit bench sur un tableau de 2000 lignes à deux clés (alpha num):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0.103804111481 sec. usort
    0.022040128707 sec. array_multisort
    Il n'y a pas photo!
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

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

Discussions similaires

  1. [Débutant] Tri de tableau à deux dimensions
    Par fireman59 dans le forum VB.NET
    Réponses: 2
    Dernier message: 21/03/2013, 09h08
  2. [Tableaux] Tri de tableau à 2 dimensions
    Par heavenvibes dans le forum Langage
    Réponses: 3
    Dernier message: 22/06/2008, 03h53
  3. [Tableaux] Afficher un tableau à deux dimension
    Par Space Cowboy dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2007, 10h36
  4. [Tableaux] Problème tri de tableau à deux dimensions
    Par squall62 dans le forum Langage
    Réponses: 21
    Dernier message: 24/05/2006, 19h18
  5. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 22h38

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