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 contenant des objets


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut [Tableaux] Tri de tableau contenant des objets
    Bonjour à tous,

    J'ai un tableau avec à l'intérieur des objets, j'aimerai trier mon tableau en utilisant comme valeur de tri un des attributs de mon objet.

    ex : $array( 0 => objet { id, nom, titre }, 1 => objet { id, nom, titre } ...etc )

    Et donc je veux trier mon tableau sur l'attribut nom.

    Quelqu'un aurait-il une idée de la manière à suivre ?

    En cherchant sur le net j'ai peut être trouver une piste avec la fonction php uasort () mais je ne comprends pas comment l'utiliser dans mon cas précis.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Il faut en effet que tu utilises une fonction de tri qui prend en paramètre une fonction de comparaison pour réaliser le tri (uasort ou usort).

    Citation Envoyé par doc PHP
    La fonction de comparaison cmp_function doit retourner un entier, qui sera inférieur, égal ou supérieur à zéro suivant que le premier argument est considéré comme plus petit, égal ou plus grand que le second argument. Si les deux arguments sont égaux, leur ordre est indéfini.
    Ca doit donner quelque chose comme ça pour un tri alphabétique sur l'attribut nom (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function cmpObjet($a, $b)
    {
        return strcomp($a->nom,  $b->nom);
    }
     
    usort($array, "cmpObjet");

  3. #3
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    Merci pour ton aide.
    str_comp est une fonction défini par php ou c'est à moi de la créer ?
    Crois tu que je puisse définir comme méthode de ma class la fonction fonction cmpObjet($a, $b) sachant que la class qui remplit le tableau d'objet est une class qui gère une collection d'objets de ce type ?

  4. #4
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    Ok je viens de trouver pour la fonction de comparaison de chaines, enfin j'ai trouvé strcmp mais pas str_cmp ?

    Sinon je n'arrive toujours pas à mes fins.. Je ne comprends pas le principe de tri c'est donc dur d'assimilé la fonction ..

    Peux tu m'éclairer encore un peu s'il te plait ?

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    En effet, c'était strcomp et pas str_comp

    Le principe du tri, c'est de comparer des éléments 2 à 2 pour savoir lequel doit se positionner avant l'autre. Il y a différents algorithmes qui en fonction du choix des éléments à comparer permettent d'optimiser les tris. Un de ces algorithme est utilisé par la fonction usort. La seule chose dont cette fonction a besoin c'est, à partir de deux éléments du tableau, de savoir quel élément est inférieur à l'autre.

    Pour ça, on doit déclarer une fonction de comparaison qui prend en paramètre deux éléments du tableau, et qui retourne -1 (ou une autre valeur négative) quand le premier élément est plut petit que le second, 0 quand ils sont égaux et 1 (ou un autre nombre positif) quand le premier est plus grand que le second.

    J'ai utilisé dans la fonction proposée strcomp parce que c'est exactementce qu'elle fait sur les chaînes de carcatères. Mais on auraittrès bien pu le faire à la main :
    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 cmpObjet($a, $b)
    {
        if ($a->nom == $b->nom)
        {
            return 0;
        }
        else if ($a->nom < $b->nom)
        {
            return -1;
        }
        else
        { // $a->nom > $b->nom
            return 1;
        }
    }
    Quand tu dis que tu n'arrives pas à tes fins, où en es-tu ? peux-tu nous montrer le code qui te pose problème ?

  6. #6
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    Ok je te remercie j'ai compris et j'ai réussi à faire mon tri !, malheuresement étant donnée que les ressources proviennent d'une requête avec un "LIMIT" (qui me sert à gérer une pagination) mon tableau ne contient pas tous mes éléments et du coup le tris se re fait à chaque page sans prendre en compte les élément précédent et suivant ... grosse erreur d'analyse de ma part !

    Mon autre problème c'est que je ne peux pas faire ce tri directement dans la requête qui alimente le tableau via "ORDER BY" (ce qui m'aurait énormément facilité la tâche) ...
    Je pense avoir trouvé une autre solution, je vais m'y atteler aujourd'hui !
    En tout cas encore merci pour tes explications j'aurai au moins appris à me servir de cette fonction qui me parait tout de même très fonctionnelle.

  7. #7
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Pourquoi ne peux-tu pas faire ton tri dans la requête, si toutes tes données proviennent de la base ?

  8. #8
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    En faite je pense que c'est jouable mais je n'arrive pas à la faire ... je me suis donc dirigé vers une autre solution. Je manque de connaissance en SQL ...

  9. #9
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par erehcab Voir le message
    En faite je pense que c'est jouable mais je n'arrive pas à la faire ... je me suis donc dirigé vers une autre solution. Je manque de connaissance en SQL ...
    Si tu postes ta requête en nous disant quels tris tu veux faire, on pourra t'y aider

    Mais puisque tu t'es dirigé vers une autre solution, peux-tu nous dire laquelle ?
    Parce que si tu ne tries pas en faisant ta requête, et que tu as toujours une limitation des résultats retournés, je ne vois pas comment tu peux t'en sortir...

  10. #10
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    La solution ça été de simplifier mon tri ... (pas bien je sais )
    En faite mon problème est que la colonne concerné par le tri qui m'intéresserait se trouve dans une autre table (ce n'est pas juste une simple relation de type CIM).
    Si tu veux bien je peux t'expliquer un peu le contexte et te montrer un schéma de ma base ?
    Peut être tu pourras m'aiguiller sur la démarche SQL à suivre !

  11. #11
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Oui, si tu nous donnes la structure des tables concernées, la requête que tu fais jusqu'à présent et le tri que tu aimerais avoir, on pourra t'aider

    Edit : discussion sur la requête à réaliser dans le forum MySQL :
    http://www.developpez.net/forums/d62...uete-complexe/

Discussions similaires

  1. Parcour d'un tableau contenant des objets
    Par Super_carotte dans le forum Langage
    Réponses: 6
    Dernier message: 09/12/2011, 17h40
  2. Tri sur plusieurs champs d'un tableau contenant des objets
    Par swampsnake dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/07/2011, 14h14
  3. [iText] Tableau contenant des tableaux
    Par drizztoli dans le forum Documents
    Réponses: 2
    Dernier message: 01/09/2010, 22h51
  4. [POO] Tri d'un tableau contenant des objets
    Par shadypierre dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2009, 21h49
  5. Tri d'un tableau contenant des heures;
    Par Bourak dans le forum Delphi
    Réponses: 3
    Dernier message: 27/07/2006, 13h57

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