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 :

Tri tableau php


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut Tri tableau php
    Bonjour à tous,

    J'ai ce tableau
    print_r ($montab);
    Array ( [65] => 2 [73] => 3 [76] => 1 [75] => 1 [72] => 1 )

    Il faut le lire comme ceci, j'ai 2 fois la valeur 65, 3 fois la valeur 73, 1 fois le 76, 1 fois le 75 et une fois le 72.

    Je lui fais un arsort
    arsort($montab);
    j'obtiens
    Array ( [73] => 3 [65] => 2 [72] => 1 [76] => 1 [75] => 1 )

    Presque super, j'ai bien en premier le 73 puisque je l'ai 3 fois, en deuxième j'ai bien le 72 car je l'ai 2 fois, mais ensuite ... l'ordre n'est pas du tout respecter. J'ai une fois le 72, alors que à l'origine, c'est le 76 qui était mentionné ... etc ...

    Comment puis-je garder l'ordre d'origine lorsque le nombre est égal ???
    Existe-t-il une fonction toute faite ??? Ca fait 2 jours que je tourne en rond ... et je commence à avoir le tournis

    Merci infiniment pour votre coup de main ...

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Utilise les fonctions usort qui trient par une fonction personnalisée

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    merci gototog pour ta réponse

    j'avais essayé cette fonction, mais je ne pensais qu'elle pouvait résoudre mon problème.

    J'ai donc défini cette fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function my_sort($a, $b){
       if ($a == $b) 
          return 0;
       return ($a>$b) ? -1:1;
    }
     
    usort($montab,"my_sort");
    Mais j'obtiens le résultat suivant
    Array ( [0] => 3 [1] => 2 [2] => 1 [3] => 1 [4] => 1 )
    La clé disparait et je ne sais pas comment la conserver avec cette méthode ??

    Je souhaite obtenir le résultat suivant :
    Array ( [73] => 3 [65] => 2 [76] => 1 [75] => 1 [72] => 1 )

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    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 101
    Points : 4 446
    Points
    4 446
    Par défaut
    Citation Envoyé par Cyril012 Voir le message
    La clé disparait et je ne sais pas comment la conserver avec cette méthode ??
    normal cette fonction usort() n'a pas d' Association clé-valeur http://php.net/manual/fr/array.sorting.php
    $moi= ( !== ) ? : ;

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    exact
    j'ai donc utilisé uasort();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function my_sort($a, $b){
    if ($a == $b)
    return 0;
    return ($a>$b) ? -1:1;
    }
     
    uasort($montab,"my_sort");
    mais je me retrouve avec la même problématique, a savoir, lorsque j'ai une égalité, l'ordre de départ, n'est pas respectée

    Voici l'ordre de départ
    Array ( [65] => 2 [73] => 3 [76] => 1 [75] => 1 [72] => 1 )

    et voici ce que j'obtiens avec uasort
    Array ( [73] => 3 [65] => 2 [72] => 1 [76] => 1 [75] => 1 )


    ???

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    En gros, il faut que tu triches et que tu forces un tri pour le cas où les valeurs sont égales. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function my_sort($a, $b){
    if ($a == $b)
    return 1; // si elles sont égales, on considère que a < b
    return ($a>$b) ? -1:1;
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    Merci Celira, j'ai essayé mais ...

    si je mets
    if ($a == $b)
    return 0;
    return ($a>$b) ? -1:1;
    J'obtiens
    tableau d'origine : Array ( [65] => 2 [73] => 3 [76] => 1 [75] => 1 [72] => 1 )
    tableau obtenu : Array ( [73] => 3 [65] => 2 [72] => 1 [76] => 1 [75] => 1 )

    Si je mets :
    if ($a == $b)
    return 1; // si elles sont égales, on considère que a < b
    return ($a>$b) ? -1:1;
    J'obtiens
    tableau d'origine : Array ( [65] => 2 [73] => 3 [76] => 1 [75] => 1 [72] => 1 )
    tableau obtenu : Array ( [73] => 3 [65] => 2 [75] => 1 [76] => 1 [72] => 1 )

    alors que je souhaite
    Array ( [73] => 3 [65] => 2 [76] => 1 [75] => 1 [72] => 1 )

    je ne parviens pas a respecter l'ordre en cas d'égalite

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    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 101
    Points : 4 446
    Points
    4 446
    Par défaut
    en 2 passes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ksort($montab);
    arsort($montab);
    $moi= ( !== ) ? : ;

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Double brouette inversée :

    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 ( 65 => 2,73 => 3, 76 => 1,75 => 1, 72 => 1 );
     
    foreach ($tab as $key=>$value) {
       $rev[$value][] = $key;
    }
     
    krsort($rev);
     
    foreach ($rev as $key=>$values) {
    	foreach ($values as $value) {
         $result[$value] = $key;
    	}
    }
     
    print_r($result);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    Sabotage, tu portes mal ton pseudo ... il semble que tu viennes de résoudre mon problème
    Je te remercie infiniment, ainsi que tout ceux qui ont contribué à ce poste

    Bonne continuation à tous

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

Discussions similaires

  1. tri Tableau php
    Par notil21 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 06/01/2011, 18h32
  2. [MySQL] Tableau php, mysql, pages, et tri.
    Par Velkan.nexus dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/04/2008, 05h51
  3. [Tableaux] tri tableau php
    Par billebo dans le forum Langage
    Réponses: 16
    Dernier message: 09/03/2007, 13h40
  4. tri tableau php
    Par billebo dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 07/03/2007, 20h11
  5. [Tableaux] PHP Construction et Tri de tableau PHP
    Par sirbaldur dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2006, 15h12

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