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 avec exceptions


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut Tri avec exceptions
    Bonjour,

    J'ai un tableau, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $tab = array ('a', 'b', 'c', 'd' 'e');
    Je veux le trier de façon naturelle, mais en gérant des exceptions, par exmple 'e' avant 'a' et 'd' avant 'c' de façon à obtenir le tri suivant :

    e
    a
    b
    d
    c

    Je suppose que c'est possible mais comment faire ?

    Merci d'avance.

  2. #2
    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
    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
    function cmp($a, $b) {
    $trie= array ('a'=>2, 'b'=>3, 'c'=>6, 'd'=>5, 'e'=>1, 'f'=>4, 'g'=>5);
    $a_value = $trie[$a];
    $b_value = $trie[$b];
    if ($a_value == $b_value) {
            return 0;
        }
        return ($a_value < $b_value) ? -1 : 1;
    }
     
    $tab = array ('a', 'b', 'c', 'd', 'e');
    usort($tab, "cmp");
    var_dump($tab);
    Il y a peut être plus élégant.

    Une version avec des mots :
    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
    function cmp($a, $b) {
    $tri = array ('a'=>2, 'b'=>3, 'c'=>6, 'd'=>5, 'e'=>1, 'f'=>4, 'g'=>5);
    $max = strlen($a);
    for ($i = 0; $i < $max; $i++) {
    	if (!isset($b[$i])) {
    		return 1;
    	}
    	if($tri[$a[$i]] > $tri[$b[$i]]) {
    		return 1;
    	}
    	elseif ($tri[$a[$i]] < $tri[$b[$i]]) {
    		return -1 ;
    	}
    }
     
    return 0;
    }
     
    $tab = array ('aef', 'ae', 'cfa', 'd', 'e');
    usort($tab, "cmp");
    var_dump($tab);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Bonjour sabotage,

    Merci de ta réponse (notification par mail non reçue...).

    Néanmoins, ce qui me gêne est que tu enrichis le tableau d'origine avec des valeurs correspondantes au classement.

    Dans ce cas, il me semble aussi simple de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $tab = array_flip ($tab);
    ksort ($tab);
    $tab = array_flip ($tab);
    J'aimerais pouvoir ne pas toucher au tableau d'origine et simplement signifier que 'e' avant 'a' et 'd' avant 'c'.

    Dans la réalité j'ai beaucoup de tableaux avec beaucoup de valeurs et la maintenance devient trop tordue s'il faut donner un ordre, je veux juste gérer quelques exceptions au classement naturel.

  4. #4
    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
    Par défaut
    je ne touche pas au tableau d'origine ($tab), $tri est le tableau contenant l'ordre souhaité.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 734
    Par défaut
    Bonjour sabotage,

    D'accord.

    Mais cela t'oblige quand même à recopier le tableau dans la fonction et numéroter l'ordre.

    J'essaye de réfléchir à une solution plus simple ou tu aurais juste besoin d'indiquer :

    $tab_exception = array ('e' =>'a', 'd' =>'c');

  6. #6
    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
    Par défaut
    Mais cela t'oblige quand même à recopier le tableau dans la fonction et numéroter l'ordre.
    non $tri est l'ordre souhaité pour l'alphabet, je me suis arrêté à g pour l'exemple.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. Problème de tri avec analyse croisée
    Par drthodt dans le forum Access
    Réponses: 2
    Dernier message: 18/10/2005, 16h23
  2. formule de calcul du TRI avec PL/SQL
    Par mongilotti dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 30/07/2005, 20h23
  3. Pb de tri avec champs vide
    Par Invité dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2004, 17h42
  4. tri avec l'ordre UPDATE et incrementation d'une colonne
    Par Staron dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/02/2004, 08h48
  5. tri avec les champs vides en dernier
    Par r-zo dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/09/2003, 13h40

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