Comment trier un tableau PHP par un élément imbriqué à l'intérieur?
j'ai un tableau comme ceci:
Array ( [0] => Array ( 'name' => "Friday" 'weight' => 6 ) [1] => Array ( 'name' => "Monday" 'weight' => 2 ) )
je voudrais saisir les dernières valeurs dans ce tableau (le 'poids'), et utiliser cela pour trier les éléments du tableau principal. Donc, dans ce tableau, je voudrais le trier de façon à ce que l'élément "lundi" apparaisse avant l'élément "vendredi".
8 réponses
peut être fait en utilisant un fonction anonyme.
Aussi, si votre 'poids' est un chaîne utilisez l'un des autres retours (voir les lignes commentées):
<?php
$arr = array(
0 => array (
'name' => 'Friday',
'weight' => 6,
),
1 => array (
'name' => 'Monday',
'weight' => 2,
),
);
// sort by 'weight'
usort($arr, function($a, $b) { // anonymous function
// compare numbers only
return $a['weight'] - $b['weight'];
// compare numbers or strings
//return strcmp($a['weight'], $b['weight']);
// compare numbers or strings non-case-sensitive
//return strcmp(strtoupper($a['weight']), strtoupper($b['weight']));
});
var_export($arr);
/*
array (
0 => array (
'name' => 'Monday',
'weight' => 2,
),
1 => array (
'name' => 'Friday',
'weight' => 6,
),
)
*/
D'accord avec usort, j'utilise aussi parfois array_multisort (http://ca2.php.net/manual/en/function.usort.php) Exemple 3, Tri des résultats de la base de données. Vous pourriez faire quelque chose comme:
<?php
$days = array(
array('name' => 'Friday', 'weight' => 6),
array('name' => 'Monday', 'weight' => 2),
);
$weight = array();
foreach($days as $k => $d) {
$weight[$k] = $d['weight'];
}
print_r($days);
array_multisort($weight, SORT_ASC, $days);
print_r($days);
?>
Sortie:
Array
(
[0] => Array
(
[name] => Friday
[weight] => 6
)
[1] => Array
(
[name] => Monday
[weight] => 2
)
)
Array
(
[0] => Array
(
[name] => Monday
[weight] => 2
)
[1] => Array
(
[name] => Friday
[weight] => 6
)
)
Vous pouvez également utiliser une fonction anonyme.
usort($items, function($a, $b) {
return $a['name'] > $b['name'];
});
si le fichier que vous triez par est string comme title
name
,
array_multisort + Drapeaux pour Tri Naturel et CaseInSensitivity sont la voie à suivre:
$sort_by_title = array();
foreach($items as $item) {
$sort_by_title [] = $item['title'];
}
array_multisort($sort_by_title , SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items );
notez, si l'élément sur lequel vous faites le tri est un flottant comme .0534 et .0353 (comme pour un pourcentage), alors vous devez multiplier les deux PAR 1000. je ne sais pas pourquoi franchement... il semble que usort semble à comparer les valeurs entières.
m'a fallu un certain temps pour comprendre cela...
et les 2 conseils qui peuvent ne pas être immédiatement évident:
- si vos tableaux sont des objets, vous pouvez utiliser return $a->poids - $b->poids bien sûr
- si vous revenez $b->poids - $a->poids, il va trier desending.
Voici une fonction de refroidissement qui pourraient vous aider:
function subval_sort($a,$subkey,$sort) {
foreach($a as $k=>$v) {
$b[$k] = strtolower($v[$subkey]);
}
if($b)
{
$sort($b);
foreach($b as $key=>$val) {
$c[] = $a[$key];
}
return $c;
}
}
envoyer le tableau comme $a
la touche $subkey
et' asort 'ou' sort ' pour le $sort
variable