609 votes

Comment trier un tableau de tableaux associatifs par valeur d'une clé donnée en PHP

Difficile à expliquer alors voici un exemple:

 $inventory = array(

   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),
   array("type"=>"pork", "price"=>5.43),

);
 

Je voudrais trier l'élément de l'inventaire par prix, donc je voudrais:

 $inventory = array(

   array("type"=>"pork", "price"=>5.43),
   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),

);
 

Je suis presque positif PHP a une fonction pour le faire (je suis sûr que je l'ai fait il y a un certain temps), mais je ne m'en souviens pas!

802voto

Josh Davis Points 12974

Vous avez raison, la fonction que vous recherchez est array_multisort() .

Voici un exemple tiré directement du manuel et adapté à votre cas:

 $price = array();
foreach ($inventory as $key => $row)
{
    $price[$key] = $row['price'];
}
array_multisort($price, SORT_DESC, $inventory);
 

514voto

Mark Amery Points 4705

Depuis PHP 5.3, qui a introduit des fonctions anonymes, le plus simple et le plus simple est probablement d'utiliser usort avec un inline fonction anonyme comme la fonction de comparaison, comme suit:

usort($inventory, function ($item1, $item2) {
    return $item1['price'] - $item2['price'];
});

Je pense que c'est plus facile à comprendre que l' approche proposée par Josh Davis à l'aide de array_multisort

Notez que la fonction de comparaison transmis usort doit se comporter comme suit (à partir de la documentation):

La fonction de comparaison doit retourner un entier inférieur, égal ou supérieur à zéro si le premier argument est respectivement inférieure, égale, ou supérieure à la seconde.

...

De retour non-entier les valeurs de la fonction de comparaison, tels que le flotteur se traduira par une distribution interne à l'entier de la fonction de rappel de la valeur de retour. De sorte que les valeurs telles que 0,99 et de 0,1 permettra à la fois d'être converti en une valeur entière de 0, ce qui permettra de comparer des valeurs telles que l'égalité.

47voto

zombat Points 46702

Étant donné que les éléments de votre tableau sont eux-mêmes des tableaux avec des clés de chaîne, le mieux est de définir une fonction de comparaison personnalisée. C'est assez rapide et facile à faire. Essaye ça:

 function invenDescSort($item1,$item2)
{
    if ($item1['price'] == $item2['price']) return 0;
    return ($item1['price'] < $item2['price']) ? 1 : -1;
}
usort($inventory,'invenDescSort');
print_r($inventory);
 

Produit ce qui suit:

 Array
(
    [0] => Array
        (
            [type] => pork
            [price] => 5.43
        )

    [1] => Array
        (
            [type] => fruit
            [price] => 3.5
        )

    [2] => Array
        (
            [type] => milk
            [price] => 2.9
        )

)
 

30voto

Danielzt Points 23

Je me suis arrêté là-dessus:

 function sort_array_of_array(&$array, $subfield)
{
    $sortarray = array();
    foreach ($array as $key => $row)
    {
        $sortarray[$key] = $row[$subfield];
    }

    array_multisort($sortarray, SORT_ASC, $array);
}
 

Appelez simplement la fonction, en passant le tableau et le nom du champ du tableau de second niveau. Comme:

 sort_array_of_array($inventory, 'price');
 

14voto

danamlund Points 216
 $inventory = 
    array(array("type"=>"fruit", "price"=>3.50),
          array("type"=>"milk", "price"=>2.90),
          array("type"=>"pork", "price"=>5.43),
          );

function pricesort($a, $b) {
  $a = $a['price'];
  $b = $b['price'];
  if ($a == $b)
    return 0;
  return ($a > $b) ? -1 : 1;
}

usort($inventory, "pricesort");
// uksort($inventory, "pricesort");

print("first: ".$inventory[0]['type']."\n\n");
// for usort(): prints milk (item with lowest price)
// for uksort(): prints fruit (item with key 0 in the original $inventory)

// foreach prints the same for usort and uksort.
foreach($inventory as $i){
  print($i['type'].": ".$i['price']."\n");
}
 

les sorties:

 first: pork

pork: 5.43
fruit: 3.5
milk: 2.9
 

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