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 recursif de tableau a plusieurs colonnes


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut [Tableaux] tri recursif de tableau a plusieurs colonnes
    Bonjour,

    Voilà, j'essaye de me faire une petite fonction de tri récursive prenant en parametre un tableau (a trié) et le nom de la colonne à comparer pour le tri...

    imaginons l'exemple suivant :

    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
     
     
    $tab_perti = array();
    while($res[] = mysql_fetch_array($req));
     
    ***traitement sup***
     
    function tri_recursif_de_tableau($tab, $colonne)
    {
            $i = 0; 
            while($i < (count($tab)-1)) // tant qu'on a pas parcouru tout le tableau
            {
                    if($tab[$i][$colonne] < $tab[$i+1][$colonne]) // si les valeurs ne sont pas dans l'ordre...
                    { // inversement de valeur
                            echo 'inversement des valeurs : ('.$tab[$i][$colonne].') et ('.$tab[$i+1][$colonne].')<br>';
                            $tmp_tab = $tab[$i];
                            $tab[$i] = $tab[$i+1];
                            $tab[$i+1] = $tmp_tab;
                            // puis on re-execute la fonction sur le tableau nouvellement trié
                            return tri_recursif_de_tableau($tab, $colonne); // du coup, on interompt le traitement de la fonction, pouisque c'est la fonction (recursivement) appelé qui va finir le travail
                    }
                    $i++;
            }
            return $tab; // si on sort du while, c qu'aucune inversion de valeur n'a été faite, et que le tri est donc fini...
    }
     
    $tab_perti = tri_recursif_de_tableau($tab_perti, 'pertinence');
    Vous allez me dire que j'aurais du faire le tri dans ma requette SQL, mais c'est un peu plus compliqué que ca en réalité car j'ommet ici l'ajout de certains champs dans $res[] qui sont renseigné a ***traitement sup***

    seulement voila, ma fonction me sort du paté et j'arrive vraiment pas à trouver mon erreur...

    dans mes test, je travail avec un tableau dont les valeurs de la colonne sur laquelle je tri sont (dans l'ordre) 0-2-2.
    Or, je devrait obtenir avec ce tri les valeurs 2-2-0...
    et manque de bol, tout ce que j'obtient, c'est 2-blanc-0-2, et l'execution me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inversement des valeurs : (0) et (2)
    inversement des valeurs : () et (2)
    inversement des valeurs : (0) et (2)
    inversement des valeurs : () et (2)
    Si quelqun a une idée, je suis preneur, parce que j'ai beau suivre mon algo a la main, j'ai pas trouvé l'erreur :/

    Merci d'avance.
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  2. #2
    Membre averti

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Points : 322
    Points
    322
    Par défaut
    est-ce un problème d'algorithme ou de php ?
    "Une méthode fixe n'est pas une méthode" (Proverbe chinois)

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    et bien a vrai dire, je suis sur de rien...

    Je crois que l'algo est bon, mais je suis pas très a l'aise avec la syntaxe des tableaux de php, et il est possible que le problème soit effectivement un probleme syntaxique...
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Plusieurs choses :
    • Tu devrais sortir le count($tab) de la boucle afin d'éviter que PHP fasse ce traitement à chaque itération (nous ne sommes pas en ADA).
    • Fais attention, tu boucles jusqu'à count()-1 mais tu compares le dernier avec +1, c'est-à-dire un index trop loin. Tu devrais boucler jusqu'à count()-2 à la place.
    • Enfin, tu ne passes pas le tableau par référence et tu ne l'utilises pas comevaleur de retour, ce qui signifie que PHP travaille toujours sur une copie de ton tableau d'origine, qui n'est jamais réellement modifié.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Citation Envoyé par Kirkis
    [*]Tu devrais sortir le count($tab) de la boucle afin d'éviter que PHP fasse ce traitement à chaque itération (nous ne sommes pas en ADA).
    En effet

    Citation Envoyé par Kirkis
    [*]Fais attention, tu boucles jusqu'à count()-1 mais tu compares le dernier avec +1, c'est-à-dire un index trop loin. Tu devrais boucler jusqu'à count()-2 à la place.
    oui, mais mon while est $i < (count()-1), j'aurais du mettre -2 si j'avais mis <= au lieu de strictement inférieur.

    Citation Envoyé par Kirkis
    [*]Enfin, tu ne passes pas le tableau par référence et tu ne l'utilises pas comevaleur de retour, ce qui signifie que PHP travaille toujours sur une copie de ton tableau d'origine, qui n'est jamais réellement modifié.[/list]
    Je le passe en copie car j'ai besoin de conserver mon tableau d'origine tel qu'il est dans le reste du code.
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Au temps pour moi, tu ne sors pas des index du tableau. Je n'avais pas fait attention au signe inférieur strict.
    Je me suis également trompé pour la valeur de retour : tu en as une.

    Bon, bin j'ai terminé ma lecture, il est temps de tester ^^
    Tu vas te marrer mais, chez moi, ton tri fonctionne...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $tab_perti[]['pertinence'] = 0;
    $tab_perti[]['pertinence'] = 2;
    $tab_perti[]['pertinence'] = 2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $tab_perti[]['pertinence'] = 2;
    $tab_perti[]['pertinence'] = 5;
    $tab_perti[]['pertinence'] = 3;
    $tab_perti[]['pertinence'] = 1;
    $tab_perti[]['pertinence'] = 7;
    $tab_perti[]['pertinence'] = 0;
    $tab_perti[]['pertinence'] = 4;
    $tab_perti[]['pertinence'] = 8;
    $tab_perti[]['pertinence'] = 3;
    $tab_perti[]['pertinence'] = 2;

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Pourquoi faire simple quand on peut faire compliqué ?
    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
    <?php
     
     
    function array_key_multi_sort($arr, $l , $f = 'strnatcasecmp')
    {
       usort($arr, create_function('$a, $b', "return $f(\$a['$l'], \$b['$l']);"));
       return($arr);
    }
     
    $tab_perti = array();
    $tab_perti[]['pertinence'] = 2;
    $tab_perti[]['pertinence'] = 5;
    $tab_perti[]['pertinence'] = 3;
    $tab_perti[]['pertinence'] = 1;
    $tab_perti[]['pertinence'] = 7;
    $tab_perti[]['pertinence'] = 0;
    $tab_perti[]['pertinence'] = 4;
    $tab_perti[]['pertinence'] = 8;
    $tab_perti[]['pertinence'] = 3;
    $tab_perti[]['pertinence'] = 2;
     
    $tab_perti_trie = array_key_multi_sort($tab_perti, 'pertinence');
     
    echo '<table><tr><td><pre>';
    print_r($tab_perti);
    echo '</pre></td><td><pre>';
    print_r($tab_perti_trie);
    echo '</pre></td></tr></table>';
     
    ?>

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Erf, moi, y'a rien a faire, mon tri marche pas, je vais donc essayer la solution "simple" ^^

    en tout cas, merci de tout coeur pour votre aide :)
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/12/2011, 13h12
  2. Tri d'un tableau de plusieurs colonnes + cellule vide
    Par Neophyte27 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/11/2010, 23h57
  3. Tri d'un tableau avec plusieurs colonnes
    Par beegees dans le forum Langage
    Réponses: 11
    Dernier message: 04/11/2008, 20h43
  4. [Tableaux] Afficher un tableau sur plusieurs colonnes
    Par sliderman dans le forum Langage
    Réponses: 5
    Dernier message: 04/01/2008, 15h46
  5. [Tableaux] tri sur un tableau multi-dimensionnel
    Par nicoaix dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2006, 21h23

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