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 :

Trier un tableau multidimensionnel ? [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut Trier un tableau multidimensionnel ?
    Bonjour à tous,

    Alors là je pêche sur un problème que je n'arrive pas à résoudre...

    Je reçois différentes données en JSON dans plusieurs tableaux. Après avoir redéfini les clés, combiné les tableaux, cela donne le tableau final ci-dessous.
    (pour information, il y a plusieurs milliers de données)

    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
    Array
    (
     [0] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var3
            )
     [1] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var2
            )
     [2] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var3
            )
     [3] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var2
            )
     [4] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var1
            )
     [5] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var2
            )
    )
    Je voudrais avoir un résultat trié comme suit :
    - on doit calculer combien de fois var1, var2 et var3 sont présent pour la clé c
    - on supprimer les doublons (peu importe si les valeurs des clés a et b sont différentes)
    - on affiche le résultat par ordre du nombre de valeurs trouvées dans le tableau original

    Cela donne donc :
    - var2 (3 fois)
    - var3 (2 fois)
    - var1 (1 fois)

    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
    Array
    (
     [0] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var2
             [d] => 3
            )
     [1] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var3
             [d] => 2
            )
     [2] => Array
            (
             [a] => peu importe
             [b] => peu importe
             [c] => var1
             [d] => 1
            )
    )
    Si vous avez une (ou LA ?) solution, je suis preneur...

    Merci beaucoup.

  2. #2
    Membre éclairé Avatar de cadoudal56
    Profil pro
    Inscrit en
    Février 2005
    Messages
    694
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

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

    Informations forums :
    Inscription : Février 2005
    Messages : 694
    Points : 779
    Points
    779
    Par défaut
    Hello,

    - on doit calculer combien de fois var1, var2 et var3 sont présent pour la clé c
    - on supprimer les doublons (peu importe si les valeurs des clés a et b sont différentes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Initialisation du tableau
    $mydata = array();
    //Pour tous les enregistrements
    foreach ($alldata as $data) {
    $mydata[$data['c']] = $mydata[$data['c']]++;
    }
    En gros on stocke la colonne c comme clé du tableau... Comme cela pas de doublon. Et on incremente de 1 a chaque fois....
    Maintenant pour l'afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Mon beau tableau roi des Array
    foreach ($mydata as $key => $value) {
    echo '<b>'.$key.'</b> :'.$value.'<br>';
    }
    Ah oui, et pour trier ???
    Ben c'est a dire qu'il faut que tu cherches un peu quand meme...
    Aller voici un indice :
    @+
    cadou

  3. #3
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut
    Merci beaucoup, j'obtiens bien 3 clés, mais seulement il y a une erreur d'index et je n'obtiens aucune valeur.

    Voici le code incluant le tableau de base :

    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
    $table = array ( '0' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var3'
                                  )
                   , '1' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var2'
                                  )
                   , '2' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var3'
                                  )
                   , '3' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var2'
                                  )
                   , '4' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var1'
                                  )
                   , '5' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var2'
                                  )
                   ) ;
     
    $mydata = array ( ) ;
     
    foreach ( $table as $data )
    {
     $mydata [ $data [ 'c' ] ] = $mydata [ $data [ 'c' ] ]++ ;
    }
     
    foreach ( $mydata as $key => $value )
    {
     echo '<b>' . $key . '</b> :' . $value . '<br />' ;
    }
    Pour array_multisort, je me disais justement que c'était le plus approprié, donc je vais creuser.

    @ bientôt et merci encore.

  4. #4
    Invité
    Invité(e)
    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
    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
     
    <?php
     
    $table = array ( '0' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var3'
                                  )
                   , '1' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var2'
                                  )
                   , '2' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var3'
                                  )
                   , '3' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var2'
                                  )
                   , '4' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var1'
                                  )
                   , '5' => array ( 'a' => 'peu importe 1'
                                  , 'b' => 'peu importe 2'
                                  , 'c' => 'var2'
                                  )
                   ) ;
     
    $mydata = array();
    foreach ($table as $key => $data) {
      $index = $data['c'];
      if (isset($mydata[$index])) {
        ++$mydata[$index];
        unset($table[$key]);
      }
      else {
        $table[$key]['d'] = 1;
        $mydata[$index] =& $table[$key]['d'];
      }
    }
    unset($mydata);
     
    usort($table, create_function('$a, $b', 'return ($a["d"]<$b["d"])?1:-1;'));
     
    echo '<pre>', print_r($table, true), '</pre>';
     
    ?>

  5. #5
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut
    Merci beaucoup Tisha

    Ca fonctionne super, je vais me plonger dans le code pour bien comprendre tout ce que tu as fait, histoire de pouvoir l'appliquer à d'autres projets !

    Merci encore...

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

Discussions similaires

  1. Trier un tableau() multidimensionnel
    Par Ravens dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 30/03/2013, 02h35
  2. Réponses: 15
    Dernier message: 18/05/2012, 13h15
  3. Trier un tableau multidimensionnel
    Par malabarbe dans le forum Langage
    Réponses: 9
    Dernier message: 04/03/2010, 20h28
  4. [Tableaux] comment trier un tableau multidimensionnel
    Par tibotibo69 dans le forum Langage
    Réponses: 2
    Dernier message: 26/02/2008, 17h04
  5. [Tableaux] trier un tableau multidimensionnel
    Par chris801 dans le forum Langage
    Réponses: 2
    Dernier message: 08/06/2007, 08h43

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