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] Trier un tableau d'objet


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Points : 62
    Points
    62
    Par défaut [Tableaux] Trier un tableau d'objet
    J'ai les deux classes suivantes et donc les deux fichiers 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
    class Item {
      private $nom;
      private $code;
      private $visible;
      private $position;
     
      function __tostring() {
        return "Cette classe permet de définir et manipuler un item de menu.<br/>";
        }
     
      function __construct($nom, $code, $visible, $position) {
        $this->nom = $nom;
        $this->code = $code;
        $this->visible = $visible;
        $this->position = $position;
        }
     
      function getNom() {
        return $this->nom;
        }
     
      function setNom($nom) {
        $this->nom = $nom;
        }
     
      function getCode() {
        return $this->code;
        }
     
      function setCode($code) {
        $this->code=$code;
        }
     
      function getVisible() {
        return $this->visible;
        }
     
      function setVisible($visible) {
        $this->visible=$visible;
        }
     
      function getPosition() {
        return $this->position;
        }
     
      function setPosition($position) {
        $this->position=$position;
        }
     
     
      }
    ?>
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php
    include('item.inc.php5');
    class Menu {
      private $items;
     
      function __tostring() {
        return "Cette classe permet de définir et manipuler un menu.<br/>";
        }
     
      function __construct() {
    /*Dans le futur les items seront le resultat de requetes dans une BD MySQL*/
        $item3 = new Item('item3','#FF6633',0,3);
        $this->items[count($this->items)] = $item3 ;
     
        $item4 = new Item('item4','#3366FF',0,4);
        $this->items[count($this->items)] = $item4 ;
     
        $item5 = new Item('item5','#FF6633',0,5);
        $this->items[count($this->items)] = $item5 ;
     
        $item2 = new Item('item2','#3366FF',0,2);
        $this->items[count($this->items)] = $item2 ;
     
        $item1 = new Item('item1','#FF6633',0,1);
        $this->items[count($this->items)] = $item1 ;
     
        $item6 = new Item('item6','#FF6633',0,3);
        $this->items[count($this->items)] = $item6 ;
        }
     
      function getItems() {
        return $this->items;
        }
     
      function setItems($items) {
        $this->items = $items;
        }
     
      function sort() {
        /*Fonction qui tri les items selon la position*/
        }
     
     
      function display() {//Affichage bateau
        $retour="";
        for($i=0;$i<count($this->items);$i++){
            $retour = $retour ." | ". $this->items[$i]->getNom();
        }
        return $retour;
        }
     
      function display1() {//Affichage après tri
        $retour="";
        $this->sort();
        for($i=0;$i<count($this->items);$i++){
            $retour = $retour ." | ". $this->items[$i]->getNom();
        }
        return $retour;
        }
      }
    ?>
    Je cherche à trier les items en fonction de leurs positions.

    J'ai donc un object Menu représenté comme ceci :
    +-----+-----+-----+-----+-----+-----+
    |item3|item4 |item5|item2|item1|item6| <-nom des items
    |3......|4......|5......|2.....|1......|3......| <-position des items
    +-----+-----+-----+-----+-----+-----+

    Je veux après le tri l'object Menu soit comme ceci :
    +-----+-----+-----+-----+-----+-----+
    |item1|item2 |item3|item6|item4|item5|
    |1......|2......|3......|3.....|4......|5......|
    +-----+-----+-----+-----+-----+-----+

    On place les positions les plus petites en 1er et quand on a deux positions identique on a la politique du 1er arriver 1er servi.

    J'espère avoir bien exprimé mon problème.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Avec usort ?
    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
    class Menu {
        private function sort($i1, $i2) {
            $a = $i1->getPosition();
            $b = $i2->getPosition();
            if ($a == $b) {
                return 0;
            }
            return ($a < $b) ? -1 : 1;
        }
     
        public function display1() {
            $retour="";
            usort($this->items, array(__CLASS__, 'sort'));
            for($i=0;$i<count($this->items);$i++){
                $retour = $retour ." | ". $this->items[$i]->getNom();
            }
            return $retour;
        }
    }
    (non testé)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Points : 62
    Points
    62
    Par défaut
    A une parenthèse près c'est bon
    Citation Envoyé par julp
    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
    class Menu {
        private function sort($i1, $i2) {
            $a = $i1->getPosition();
            $b = $i2->getPosition();// avant :  $b = $i2->getPosition());
            if ($a == $b) {
                return 0;
            }
            return ($a < $b) ? -1 : 1;
        }
     
        public function display1() {
            $retour="";
            usort($this->items, array(__CLASS__, 'sort'));
            for($i=0;$i<count($this->items);$i++){
                $retour = $retour ." | ". $this->items[$i]->getNom();
            }
            return $retour;
        }
    }
    Merci beaucoup !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Points : 62
    Points
    62
    Par défaut
    Problème :
    J'ai le Menu représenté comme ceci :
    +-----+-----+-----+-----+-----+-----+
    |item3|item4 |item5|item2|item1|item6|
    |3......|3......|3......|3.....|3......|3......|
    +-----+-----+-----+-----+-----+-----+

    Après le tri j'ai :
    +-----+-----+-----+-----+-----+-----+
    |item6|item4 |item2|item5|item4|item3|
    |3......|3......|3......|3.....|3......|3......|
    +-----+-----+-----+-----+-----+-----+

    Alors que je veux que le premier touvé reste le premier. Dans ce cas extreme où tous les items ont même position je devrais pas changer l'ordre en fait.

    Merci

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par boux2
    On place les positions les plus petites en 1er et quand on a deux positions identique on a la politique du 1er arriver 1er servi.
    J'ai loupé une partie de l'ennoncé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        private function sort($i1, $i2) {
            $a = $i1->getPosition();
            $b = $i2->getPosition();
            if ($a == $b) {
                $posi1 = array_search($i1, $this->items);
                $posi2 = array_search($i2, $this->items);
                /*if ($posi1 == $posi2) { // N'est pas censé se produire
                    return 0;
                }*/
                return ($posi1 > $posi2) ? 1 : -1;
            }
            return ($a > $b) ? 1 : -1;
        }

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup julp !

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

Discussions similaires

  1. [Tableaux] Trier un tableau d'objets
    Par mnem0 dans le forum Langage
    Réponses: 4
    Dernier message: 21/06/2007, 15h08
  2. [Tableaux] trier un tableau associatif
    Par cijez dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2006, 16h07
  3. Réponses: 5
    Dernier message: 13/06/2006, 11h08
  4. [Tableaux] Trier un tableau [array]
    Par clemsouz dans le forum Langage
    Réponses: 2
    Dernier message: 15/05/2006, 13h33
  5. [Tableaux] Trier un tableau comme avec ORDER BY DESC
    Par Anduriel dans le forum Langage
    Réponses: 28
    Dernier message: 08/12/2005, 18h50

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