php
  • arrays
  • sorting
  • multidimensional-array
  • 2010-10-19 4 views 3 likes 
    3

    Comment trier un tableau multidimensionnel par clé primaire et secondaire? Par exemple, en supposant que le tableau suivant:Tableau multidimensionnel de tri PHP avec clés primaires et secondaires

    $result = array(); 
    
    $result[0]["prio"] = 1; 
    $result[0]["date"] = '2010-02-28'; 
    $result[0]["post"] = "February's thoughts"; 
    
    $result[1]["prio"] = 0; 
    $result[1]["date"] = '2010-04-20'; 
    $result[1]["post"] = "April's thoughts"; 
    
    $result[2]["prio"] = 0; 
    $result[2]["date"] = '2010-05-30'; 
    $result[2]["post"] = "May's thoughts"; 
    

    Je souhaite trier la colonne « PRIO » comme clé primaire (croissant) et « date » comme clé secondaire (décroissant), pour obtenir :

    $result[0]["prio"] = 0; 
    $result[0]["date"] = '2010-05-30'; 
    $result[0]["post"] = "May's thoughts"; 
    $result[1]["prio"] = 0; 
    $result[1]["date"] = '2010-04-20'; 
    $result[1]["post"] = "April's thoughts"; 
    $result[2]["prio"] = 1; 
    $result[2]["date"] = '2010-02-28'; 
    $result[2]["post"] = "February's thoughts"; 
    

    Comment y parvenir?

    +1

    Est-ce que ces données proviennent d'une base de données? Vous pourriez peut-être récupérer les données dans le bon ordre en modifiant votre requête d'origine. – nnevala

    +0

    Pas assez de données de DB pour y parvenir :-( – Riccardo

    Répondre

    5

    Utilisez usort comme ceci:

    $result = array(); 
    
    $result[0]["prio"] = 1; 
    $result[0]["date"] = '2010-02-28'; 
    $result[0]["post"] = "February's thoughts"; 
    
    $result[1]["prio"] = 0; 
    $result[1]["date"] = '2010-04-20'; 
    $result[1]["post"] = "April's thoughts"; 
    
    $result[2]["prio"] = 0; 
    $result[2]["date"] = '2010-05-30'; 
    $result[2]["post"] = "May's thoughts"; 
    
    function fct($a ,$b) { 
    
        if ($a['prio'] < $b['prio']) { 
        return -1; 
        } elseif ($a['prio'] > $b['prio']) { 
        return 1; 
        } else { 
        return strcmp($b['date'], $a['date']); 
        } 
    
    } 
    
    usort($result, "fct"); 
    print_r($result); 
    

    Sortie:

    Array 
    (
        [0] => Array 
         (
          [prio] => 0 
          [date] => 2010-05-30 
          [post] => May's thoughts 
         ) 
    
        [1] => Array 
         (
          [prio] => 0 
          [date] => 2010-04-20 
          [post] => April's thoughts 
         ) 
    
        [2] => Array 
         (
          [prio] => 1 
          [date] => 2010-02-28 
          [post] => February's thoughts 
         ) 
    
    ) 
    
    +0

    Ce code triera-t-il la colonne 'date' dans la même valeur 'prio'? – Riccardo

    +0

    Oui, car il compare les dates où 'prio' est égal – Toto

    +0

    Chechmark vert à venir, laissez-moi tester un moment! – Riccardo

    1

    PHP n'a pas de fonction intégrée pour effectuer un tri complexe de la sorte, vous devrez donc faire un usort(), ce qui vous permet de trier les éléments en utilisant une fonction qui spécifie vos propres critères.

    The example given on the PHP manual page est presque une correspondance exacte pour ce que vous voulez réaliser.

    +0

    Les fonctions de tri génériques permettent de trier sur une seule "colonne" seulement ...... – Riccardo

    +0

    @Riccardo: usort vous permet de spécifier n'importe quel critère de tri, vous pouvez l'utiliser Pour trier sur un ou plusieurs éléments de tableau imbriqués, il vous suffit d'écrire une fonction qui renvoie moins de zéro ou plus de zéro en fonction de l'un des deux éléments de votre tableau que vous voulez trier plus haut. – Spudley

    0

    Vous pouvez utiliser usort() pour définir une fonction de tri personnalisée.
    Voici un exemple

    <?php 
    function cmp($a, $b) 
    { 
        if ($a == $b) { 
         return 0; 
        } 
        return ($a < $b) ? -1 : 1; 
    } 
    
    $a = array(3, 2, 5, 6, 1); 
    
    usort($a, "cmp"); 
    
    foreach ($a as $key => $value) { 
        echo "$key: $value\n"; 
    } 
    ?> 
    

    La sortie sera

    0: 1 
    1: 2 
    2: 3 
    3: 5 
    4: 6 
    

    Plus d'informations peuvent être trouvées à http://www.php.net/manual/en/function.usort.php
    Il devrait vous aider à démarrer.

    +0

    Comme je l'ai commenté ci-dessus, ces fonctions permettent de trier sur une seule colonne .... – Riccardo

    2

    array_multisort() devrait vous donner les fonctionnalités dont vous avez besoin ... utilisez l'exemple # 3 de la documentation PHP comme base de votre tri, bien que vous deviez convertir ces chaînes de date en valeur de datetime avant d'exécuter le tri.

    Si ces données proviennent d'une requête de base de données, il est beaucoup plus facile de les trier dans la requête sql utilisée pour récupérer les informations.

    +0

    Merci d'avoir signalé cela, très utile aussi! – Riccardo

    Questions connexes