6 votes

Trier un tableau d'objets en PHP par valeur de clé

En gros, j'ai une configuration comme la suivante :

Array ( 
[0] => Array ( [0] => stdClass Object ( [nid] => 1 [title] => title1 [uid] => 1 [parent] => 0 [weight] => -15 [name] => name1 [value] => 0 )
               [1] => stdClass Object ( [nid] => 2 [title] => title2 [uid] => 1 [parent] => 0 [weight] => -7 [name] => name2 [value] => 100 )
               [2] => stdClass Object ( [nid] => 3 [title] => title3 [uid] => 2 [parent] => 0 [weight] => -1 [name] => name3 [value] => 0 )
               [3] => stdClass Object ( [nid] => 4 [title] => title4 [uid] => 2 [parent] => 0 [weight] => 1 [name] => name4 [value] => 80 )
              )
  )

Ce dont j'ai besoin, c'est d'un moyen de trier tous les tableaux à l'intérieur du tableau parent en fonction de la clé [value] de l'objet. Cela fait maintenant deux jours que j'essaie avec usort et différentes méthodes, mais je n'arrive pas à m'y retrouver. La clé [value] est comprise entre 0 et 100 et j'ai besoin que tous les tableaux soient triés par ordre décroissant (de 100 à 0).

14voto

cletus Points 276888

Utilice usort :

function cmp($a, $b) {
  if ($a->value == $b->value) {
    return 0;
  } else {
    return $a->value < $b->value ? 1 : -1; // reverse order
  }
}

usort($arr, 'cmp');

4voto

John Ballinger Points 4193

100% volé à la première réponse de cette page. http://us.php.net/manual/en/function.array-multisort.php
Mais c'est ce que je cherchais.

multisort un tableau d'objets :

example object [$object with array of objects]: (class: test) 
---------------------------------- 

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [1] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [2] => test Object (
            [id] => 3
            [title] => DDDD
         )
      [3] => test Object (
            [id] => 4
            [title] => BBBB
         )
   )
)

---------------------------------- 

Simple PHP function: sort_arr_of_obj()

<?php 
// -------------------------------------- 

/* 
* -------- function arguments -------- 
*   $array ........ array of objects
*   $sortby ....... the object-key to sort by
*   $direction ... 'asc' = ascending
* --------
*/

function sort_arr_of_obj($array, $sortby, $direction='asc') {

    $sortedArr = array();
    $tmp_Array = array();

    foreach($array as $k => $v) {
        $tmp_Array[] = strtolower($v->$sortby);
    }

    if($direction=='asc'){
        asort($tmp_Array);
    }else{
        arsort($tmp_Array);
    }

    foreach($tmp_Array as $k=>$tmp){
        $sortedArr[] = $array[$k];
    }

    return $sortedArr;

}

// -------------------------------------- 
?>

example call: 
---------------------------------- 

<?php 

$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');

?>

example result: $sorted (class: test) 
---------------------------------- 

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [1] => test Object (
            [id] => 4
            [title] => BBBB
         )
      [2] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [3] => test Object (
            [id] => 3
            [title] => DDDD
         )

   )
)

3voto

Nikko Points 671

Une façon de procéder consiste à séparer le tableau de valeurs du tableau d'objets, et donc à créer deux tableaux. Vous pouvez ensuite utiliser array_multisort pour trier le tableau d'objets en fonction de l'autre tableau. Voici un exemple :

<?php
$array1 = $objectvalues
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4);
array_multisort($array1, $array2);
?>

Vous pouvez utiliser un foreach pour boucler le tableau une fois et créer un nouveau tableau avec la clé [valeur] correspondante :

<?php
foreach( $arraywithobjects as $obj )
{
    $objectvalues[] = $obj->getValue();
}
?>

Cela permet de récupérer la valeur de l'objet et de l'insérer dans un autre tableau que vous pouvez utiliser avec le multitri.

Au final, votre code ressemblera à ceci :

<?php
foreach( $arraywithobjects as $obj )
{
    $objectvalues[] = $obj->getValue();
}
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4);
array_multisort($objectvalues, $array2);
?>

Le premier tableau du champ array_multisort doit être le tableau que vous utilisez pour trier le second tableau.

Vous pouvez également ajouter d'autres méthodes de tri. Vous pouvez les lire ici : texte du lien

1voto

Ben Blank Points 21786
function cmp($a, $b) {
    return $b->value - $a->value;
}

$ary[0] = usort($ary[0], "cmp");

Pour trier un tableau en fonction d'une valeur ou d'une clé autre que simple, vous devez utiliser la fonction usort et fournissez votre propre comparaison. Les fonctions de comparaison doivent être définies de telle sorte que si $a précède $b , une valeur positive est renvoyée et une valeur négative si $b précède $a (ou zéro s'ils sont égaux). Comme vous comparez sur la base de valeurs numériques et que vous souhaitez effectuer un tri inverse, la façon la plus simple de procéder est de soustraire la "valeur" de $a de la valeur de $b .

0voto

Logan Serman Points 11537

Je peux me tromper, mais je crois que j'ai fait quelque chose comme ça en utilisant asort() (ou asort()). C'était dans une fonction de recherche, où j'avais besoin de trier un tableau à deux dimensions rempli d'indices et d'horodatages.

Je ne sais pas si cela fonctionnera dans votre cas, et je l'ai fait il y a longtemps. Peut-être que cela vous aidera à démarrer, bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X