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 comme avec ORDER BY DESC


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut [Tableaux] Trier un tableau comme avec ORDER BY DESC
    Salut,
    J'ai encore et toujours ce même tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Array (
       [0] => Array('blabla', 'blibli', 'bloblo', '2'),
       [1] => Array('blabla', 'blibli', 'bloblo', '0'),
       [2] => Array('blabla', 'blibli', 'bloblo', '1')
    )
    Je que je voudrai c'est trier ce tableau en classant les tableaux d'intérieurs selon leur valeur numérique. Dans mon exemple, je veux trier mon tableau pour qu'il devienne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Array (
       [0] => Array('blabla', 'blibli', 'bloblo', '0'),
       [1] => Array('blabla', 'blibli', 'bloblo', '1'),
       [2] => Array('blabla', 'blibli', 'bloblo', '2')
    )
    Je veux bien essayer la fontion sort() avec SORT_NUMERIC, mais le problème c'est que blibli blabla et bloblo peuvent aussi être des nombres...

    Avez-vous une idée de comment procéder?

  2. #2
    Membre confirmé Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Points : 540
    Points
    540
    Par défaut
    Avec array_multisort, tu devrait t'en sortir:

    http://fr.php.net/manual/fr/function...-multisort.php

    Bon courage, à chaque fois j'ai du mal à comprendre ce que je fait mais j'arrive toujours à résoudre ce genre de problème avec cette fonction.

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci ça s'approche de ce que je veux faire mais d'apères ce que j'ai compris, ça tri des tableaux, dans des tableaux. Or moi je veux trier tous les tableaux d'intérieurs juste en changeant leur position...

    Quelqu'un aurrait un exemple pour mon cas
    Merci

  4. #4
    Membre confirmé Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Points : 540
    Points
    540
    Par défaut
    Ca ne tri pas forcément des tableaux dans des tableaux.
    Je t'assure que j'utilise cette fonction pour résoudre les même problèmes que toi.

    Dans le lien que je t'ai donné tout a l'heure, regarde "Exemple 3", c'est celui là qu'il te faut.

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 199
    Points : 8 424
    Points
    8 424
    Billets dans le blog
    17
    Par défaut
    array_multisort( ) est assez obscur. Perso je préfère usort( ), très pratique.

  6. #6
    Membre confirmé Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Points : 540
    Points
    540
    Par défaut
    Génial pourquoi je n'y ai pas pensé plus tôt ?. En plus je connais bien usort...
    Depuis le temps que je me galère avec array_multisort...

    Ce n'est pas mon topic, mais merci Séb !

  7. #7
    Membre habitué Avatar de Avatar
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 136
    Points : 150
    Points
    150
    Par défaut
    b'soir,

    il a aussi arsort qui va bien

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 199
    Points : 8 424
    Points
    8 424
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Avatar
    il a aussi arsort qui va bien
    J'pense pas que arsort( ) permette de trier un tableau sur une de ses dimensions.

  9. #9
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci j'essai de comprendre mais dans l'exemple du manuel:

    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
    <?php
    function compare($a, $b) 
    {
       if ($a == $b) {
         return 0;
       }
       return ($a > $b) ? -1 : 1;
    }
     
    $a = array (3, 2, 5, 6, 1);
     
    usort ($a, "compare");
     
    foreach ($a as $key => $value) {
       echo "$key: $value\n";
    }
    ?>
    $b est égal à quoi ?

  10. #10
    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
    A un élément de ton tableau, tout comme le parametre $a

  11. #11
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Oui mais à quel élément de mon tableau justement?

  12. #12
    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
    Oui mais à quel élément de mon tableau justement?
    Tous.
    Ceux qui sont nécessaires pour faire le tri.
    Prend un tableau de deux éléments T = [a, b] comment tu fais pour trier ? Selon une relation d'ordre. Php ne sait pas qu'elle est la relation d'ordre dans ta tête à toi ou sur tes specs. C'est à ca que sert la fonction usort : tu lui donne une fonction qui permet de dire entre deux éléments quelconques de ton ensemble (ici ton tableau) quel est le plus petit.
    Cette fonction sera utilisée pour faire le tri.

    Prenons par exemple le tri bulle (Voir à ce propos les algorithmes de tri) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef int tab_entiers[MAX];
     
    void tri_a_bulle(tab_entiers t) {
            int i, j, tmp;
            for(i = 0 ; i < MAX ; i++)
                    for(j = 1 ; j < MAX - i ; j++)
                            if(t[j] < t[j-1]) {
    //                         ^^^^^^^^^^^^^
                                    tmp = t[j-1];
                                    t[j-1] = t[j];
                                    t[j] = tmp;
                            }
    }
    La ligne que j'ai souligné est la comparaison en question. Si usort était implémenté avec le tri bulle ci-dessus, la ligne soulignée deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                            if (compare(t[j], t[j-1]) < 0) {
    ou compare est la fonction que tu passes à usort... L'astuce, c'est que ces deux parametres peuvent être n'importe quoi, tableau, objets, ...

    Est-ce que c'est plus clair ?

  13. #13
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    C'est un peu plus clair merci à toi.
    Une question: on a $a et $b, mais ces deux élements sont obligatoires pour la fonction donc on ne peut pas avoir un $c en plus ou seulement un $a (logique ça)?

    Merci

  14. #14
    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
    essaie

  15. #15
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    lol ok
    Ahh mais quand j'y pense leur exemple n'est pas clair!
    Ils définissent $a = array(), et ensuite ils font usort($a, "fonction") puis function fonction($a, $b)...

    En gros le $a est quoi? Toujours le array même dans la fonction?

  16. #16
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Alors je continu mes questions
    J'ai une erreur "Comparaison invalide". J'ai regardé plusieurs trucs j'ai bien mis seulement $a et $b et tout, mais ça ne change rien. C'est peut être que c'est ma classe...
    Voila comment ma page est présentée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ClassOne {
     
       function replace_array($a, $b) {
          echo $a."<br>".$b; // je suis curieux ^^
       }
     
       function unefonction() {
          usort($this->elements, "replace_array");
       }
     
    }
    Ensuite sur une page qui inclue celle-ci je fais:
    $form->unefonction();
    et j'ai l'erreur.
    Qu'est ce qui plante?

  17. #17
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    met ca dans ta fonction de comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       return $a[3] - $b[3];

  18. #18
    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
    C'est bien d'être curieux 8)

    Voici pour toi, fais un copier-coller de ce script dans un script de test, tu m'en diras des nouvelles

    les callback dans les classes sont un peu spéciales, et je sais pas où c'est documenté :
    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
    <pre><?php
     
    class ClassOne {
     
        var $elements;
        function ClassOne() {
            $this->elements = array(30, 50, 20, 10, 15);
        }
     
        function replace_array($a, $b) {
            echo $a.' <?> '.$b.'<br />';
            return $a - $b;
        }
     
        function unefonction() {
            usort($this->elements, array($this,"replace_array"));
        }
     
    }
     
    $form =& new ClassOne();
    var_dump($form->elements);
    $form->unefonction(); 
    var_dump($form->elements);
     
    ?>


    Sinon pour ta non-compréhension de la doc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $a = 1;
    function foo($a) {
      ...
    }
    Les deux $a n'ont strictement rien à voir. l'une est une variable, l'autre un parametre ! nuance très importante... le bout de code ci dessus est fonctionnellement équivalent à celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $b = 1;
    function foo($a) {
      ...
    }
    ou celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $a = 1;
    function foo($b) {
      ...
    }

  19. #19
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    En plus il tri les nombres

    Plusieurs choses que je ne comprends pas:
    - pourquoi mets tu tout simplement $this dans usort()?
    - et que signifie cette ligne: surtout le <?>
    echo $a.' <?> '.$b.'<br />'
    - finalement: que retourne le $a - $b

    C'est bizarre j'ai l'impression que c'est que du hasard ce truc
    En tout cas merci

  20. #20
    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
    Citation Envoyé par Anduriel
    En plus il tri les nombres
    encore heureux !
    Citation Envoyé par Anduriel
    Plusieurs choses que je ne comprends pas:
    - pourquoi mets tu tout simplement $this dans usort()?
    je ne mets pas tout simplement $this, je mets array(objet, methode_de_l_objet) Différent !
    Citation Envoyé par Anduriel
    - et que signifie cette ligne: surtout le <?>
    echo $a.' <?> '.$b.'<br />'
    rien, oubli de ma par, remplace '<?>' par '---' ou '=?' ou 'comparé à' ou ce que tu veux
    Citation Envoyé par Anduriel
    - finalement: que retourne le $a - $b
    la différence entre $a et $b

    la callback doit retourner un nombre :
    < 0 si un paramètre est plus "petit" que l'autre
    = 0 si les deux paramètres sont "égaux"
    > 0 si l'autre paramêtre est plus petit
    D'ou le a - b=>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    a = 10
    b = 15
    a - b = -5
     
    a = 15
    b = 15
    a - b = 0
     
    a = 20
    b = 15
    a - b = 5
     
    CQFD
    Je ne sais jamais dans quel ordre par contre ($a - $b ou $b - $a pour un tri croissant)

    Citation Envoyé par Anduriel
    C'est bizarre j'ai l'impression que c'est que du hasard ce truc
    En tout cas merci
    Non non rien de hasard, de la science !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Tableaux] Trier un tableau
    Par johnstyle dans le forum Langage
    Réponses: 4
    Dernier message: 30/10/2006, 21h41
  2. [Tableaux] trier un tableau associatif
    Par cijez dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2006, 16h07
  3. [Tableaux] Trier un tableau [array]
    Par clemsouz dans le forum Langage
    Réponses: 2
    Dernier message: 15/05/2006, 13h33
  4. [Tableaux] creer 1 tableau comme dans phpmyadmin
    Par winnie82 dans le forum Langage
    Réponses: 10
    Dernier message: 14/03/2006, 15h11
  5. [SGBD] Trier un tableau crée avec mysql_fetch_array
    Par kaygee dans le forum SQL Procédural
    Réponses: 14
    Dernier message: 07/01/2006, 21h02

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