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


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Par défaut [Tableaux] Tri de tableau
    Soit le tableau suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Array ( [0] => Array ( [id] => 11 [text] => par 8 (250.40EUR) ) 
               [1] => Array ( [id] => 7 [text] => par 12 (356.40EUR) ) 
               [2] => Array ( [id] => 2 [text] => l'unité ) )
    Comment puis je trier mon tableau par ordre croissant de "text" ?

    C'est à dire, en premier "l'unité" et ensuite "par 8", "par 12", etc....

    Ce tableau n'est qu'un exemple je ne connais pas à l'avance le contenu des champs "text", je sais qu'il y a toujours "l'unité" mais après ca peut contenir "par 14", "par 36", par 2", "par 4"

  2. #2
    Membre éclairé Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Par défaut
    Personne ne peut m'aider ??

  3. #3
    Expert confirmé 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
    Par défaut
    je vote pour usort =>
    http://php.net/usort

  4. #4
    Membre éclairé Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Par défaut
    Bah je tourne sur usort depuis ce matin 9h et j'arrive pas a trouver la solution...

    J'ai fait ca mais ca marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function compare($a, $b) 
    {
       return strcmp($a["text"], $b["text"]);
    }
     
    sort($products_options_array, "compare");
    Ca me renvoye ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Array ( [0] => Array ( [id] => 11 [text] => par 8 (250.40EUR) ) 
    [1] => Array ( [id] => 7 [text] => par 12 (356.40EUR) ) 
    [2] => Array ( [id] => 2 [text] => l'unité ) )

  5. #5
    Expert confirmé 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
    Par défaut
    Je te propose de tester et adapter ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function compare($a , $b) {
       if ($a['text'] == $b['text']) {
          return 0;
       } else {
          return  $a['text'] < $b['text'] ? 1 : -1;
       }
    }
     
    usort($array, 'compare');

  6. #6
    Expert confirmé 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
    Par défaut
    ton truc est très bien, mais utilise usort plutot que sort non ?

  7. #7
    Membre éclairé Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Par défaut
    tableau non trié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Array ( [0] => Array ( [id] => 11 [text] => par 8 (250.40EUR) ) 
    [1] => Array ( [id] => 7 [text] => par 12 (356.40EUR) ) 
    [2] => Array ( [id] => 2 [text] => l'unité ) )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function compare($a, $b) 
    {
       return strcmp($a["text"], $b["text"]);
    }
     
    usort($products_options_array, "compare");
    renvoye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Array ( [0] => Array ( [id] => 2 [text] => l'unité ) 
    [1] => Array ( [id] => 7 [text] => par 12 (356.40EUR) )
    [2] => Array ( [id] => 11 [text] => par 8 (250.40EUR) ) )
    par 8 et par 12 sonr inversé, comment puis je faire ?

    cela vient-il du fait que 12 passe avant 8 car 1 < 8 ?

  8. #8
    Membre émérite Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Par défaut
    Avec une petite fonction comme :

    <?php
    &#160;&#160;&#160;&#160;
    function&#160;sort_array&#160;(&#160;$tab&#160;)
    &#160;&#160;&#160;&#160;{
    &#160;&#160;&#160;&#160;
    $new_tab&#160;=&#160;array()&#160;;

    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach&#160;(&#160;
    $tab&#160;as&#160;$k&#160;=>&#160;$v&#160;)&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $var&#160;=&#160;preg_replace&#160;(&#160;"#par&#160;(.*?)(&#160;\(.*?\))#si"&#160;,&#160;"\\1"&#160;,&#160;$tab[$k]['text']&#160&#160;;&#160;
    &#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $var&#160;=&#160;!is_numeric&#160;(&#160;$var&#160;)&#160;?&#160;1&#160;:&#160;$var&#160;;
    &#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $new_tab[$var]['id']&#160;=&#160;$tab[$k]['id']&#160;;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $new_tab[$var]['text']&#160;=&#160;$tab[$k]['text']&#160;;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
    &#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;
    ksort&#160;(&#160;$new_tab&#160;)&#160;;
    &#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;return&#160;
    $new_tab&#160;;&#160;
    &#160;&#160;&#160;&#160;}
    ?>

    Phpsyntaxcolor powered by decabodi
    On obtiens bien ce que tu cherches, mais les index ne sont plus conservé... A tester ?

  9. #9
    Expert confirmé 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
    Par défaut
    Citation Envoyé par schlough
    cela vient-il du fait que 12 passe avant 8 car 1 < 8 ?
    oui. Utilise =>
    http://php.net/strnatcmp pour voir

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Ton indice ['text'] est vu par PHP comme un string, il triera donc 12 xxx avant 8 xxx. C'est un comportement normal.

    Il existe une fonction peu utilisée mais bien pratique dans ce cas:
    http://php.belnet.be/manual/fr/function.natsort.php

    Avec un peu de manip de tableau, voici une solution possible:

    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
    $a = Array (
      Array ( 'id' => 11, 'text' => '8 (250.40EUR)' ),
      Array ( 'id' => 7, 'text' => '12 (356.40EUR)' ),
      Array ( 'id' => 2, 'text' => '1 (356.40EUR)' )
    );
     
    // on isole l'indice sur lequel on veut faire le tri
    foreach ($a as $k=>$v){
      $cle[] = $v['text']; 
    }
     
    // on trie $cle avec l'ordre naturel (8 avant 12)
    natsort($cle);
     
    // on récupère les indices de $cle triés
    $key = array_keys($cle);
     
    // on boucle pour extraire le résultat
    foreach ($key as $k=>$v){
      $resultat[] = $a[$v];
    }

  11. #11
    Membre émérite Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Par défaut
    Mal solution elle plait à personne ?

  12. #12
    Expert confirmé 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
    Par défaut
    Citation Envoyé par macbook
    Mal solution elle plait à personne ?
    regexp == berk

  13. #13
    Membre émérite Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Par défaut
    Citation Envoyé par Mr N.
    regexp == berk

  14. #14
    Membre éclairé Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Par défaut
    Citation Envoyé par ripat
    Ton indice ['text'] est vu par PHP comme un string, il triera donc 12 xxx avant 8 xxx. C'est un comportement normal.

    Il existe une fonction peu utilisée mais bien pratique dans ce cas:
    http://php.belnet.be/manual/fr/function.natsort.php

    Avec un peu de manip de tableau, voici une solution possible:

    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
    $a = Array (
      Array ( 'id' => 11, 'text' => '8 (250.40EUR)' ),
      Array ( 'id' => 7, 'text' => '12 (356.40EUR)' ),
      Array ( 'id' => 2, 'text' => '1 (356.40EUR)' )
    );
     
    // on isole l'indice sur lequel on veut faire le tri
    foreach ($a as $k=>$v){
      $cle[] = $v['text']; 
    }
     
    // on trie $cle avec l'ordre naturel (8 avant 12)
    natsort($cle);
     
    // on récupère les indices de $cle triés
    $key = array_keys($cle);
     
    // on boucle pour extraire le résultat
    foreach ($key as $k=>$v){
      $resultat[] = $a[$v];
    }
    Merci beaucoup, ca marche impeccable

  15. #15
    Membre émérite Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Par défaut
    Vi, mais là on part d'un tableau :

    <?php
    $tab&#160;
    =&#160;array&#160;(&#160;&#160;&#160;&#160;&#160;0&#160;=>&#160;array&#160;(&#160;'id'&#160;=>&#160;11&#160;,&#160;'text'&#160;=>&#160;'par&#160;8&#160;(250.40EUR)'&#160;)&#160;,
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    1&#160;=>&#160;array&#160;(&#160;'id'&#160;=>&#160;7&#160;,&#160;'text'&#160;=>&#160;'par&#160;12&#160;(356.40EUR)'&#160;)&#160;,
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    2&#160;=>&#160;array&#160;(&#160;'id'&#160;=>&#160;2&#160;,&#160;'text'&#160;=>&#160;'l\'unité'&#160;)
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160&#160;;
    ?>

    Phpsyntaxcolor powered by decabodi
    Pour finir par :

    <?php
    $a&#160;
    =&#160;Array&#160;(
    &#160;&#160;Array&#160;(&#160;
    'id'&#160;=>&#160;11,&#160;'text'&#160;=>&#160;'8&#160;(250.40EUR)'&#160;),
    &#160;&#160;Array&#160;(&#160;
    'id'&#160;=>&#160;7,&#160;'text'&#160;=>&#160;'12&#160;(356.40EUR)'&#160;),
    &#160;&#160;Array&#160;(&#160;
    'id'&#160;=>&#160;2,&#160;'text'&#160;=>&#160;'1&#160;(356.40EUR)'&#160;)
    );
    ?>
    Dans le deuxième cas il manque la chaine 'par ' dans ['text'] et l'option de se retrouver avec la chaine 'l'unité'...

    Comment donner une solution viable si les données du problèmes changent en cour de route ?

  16. #16
    Expert confirmé 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
    Par défaut
    Citation Envoyé par macbook
    Comment donner une solution viable si les données du problèmes changent en cour de route ?
    +1
    surtout qu'a priori la solution peut se résumer en trois lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function compare($a, $b) {
       return strnatcmp($a["text"], $b["text"]);
    }
     
    usort($products_options_array, "compare");
    (et sans regexp )

  17. #17
    Membre éclairé Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Par défaut
    ca marche aussi en laissant "par" et avec la chaine 'l'unité' car toute facon par odre alphabétique, "l'unité" est avant "par"

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

Discussions similaires

  1. [Tableaux] Tri de tableau
    Par WagaSeb dans le forum Langage
    Réponses: 16
    Dernier message: 24/05/2007, 12h41
  2. [Tableaux] Tri de tableau
    Par winnie82 dans le forum Langage
    Réponses: 8
    Dernier message: 25/07/2006, 10h32
  3. [Tableaux] Tri de tableau
    Par BenoitDenis dans le forum Langage
    Réponses: 34
    Dernier message: 14/04/2006, 10h37
  4. [Tableaux] tri de tableau deux dimensions
    Par oursquetaire dans le forum Langage
    Réponses: 8
    Dernier message: 27/12/2005, 14h27
  5. [Tableaux] tri de tableau
    Par rdams dans le forum Langage
    Réponses: 19
    Dernier message: 08/11/2005, 13h46

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