Trier le tableau multidimensionnel par valeur
comment trier ce tableau par la valeur de la touche "ordre"? Même si les valeurs sont actuellement séquentielle, ils ne seront pas toujours.
Array
(
[0] => Array
(
[hashtag] => a7e87329b5eab8578f4f1098a152d6f4
[title] => Flower
[order] => 3
)
[1] => Array
(
[hashtag] => b24ce0cd392a5b0b8dedc66c25213594
[title] => Free
[order] => 2
)
[2] => Array
(
[hashtag] => e7d31fc0602fb2ede144d18cdffd816b
[title] => Ready
[order] => 1
)
)
9 réponses
Try a usort , si vous êtes encore sur PHP 5.2 ou plus tôt, vous devrez définir une fonction de tri en premier:
function sortByOrder($a, $b) {
return $a['order'] - $b['order'];
}
usort($myArray, 'sortByOrder');
à partir de PHP 5.3, vous pouvez utiliser une fonction anonyme:
usort($myArray, function($a, $b) {
return $a['order'] - $b['order'];
});
et enfin avec PHP 7 vous pouvez utiliser le opérateur de vaisseau spatial :
usort($myArray, function($a, $b) {
return $a['order'] <=> $b['order'];
});
pour l'étendre au tri multidimensionnel, référez-vous aux deuxième / troisième éléments de tri si le premier est zéro - mieux expliqué ci-dessous. Vous pouvez également l'utiliser pour trier sur les sous-éléments.
usort($myArray, function($a, $b) {
$retval = $a['order'] <=> $b['order'];
if ($retval == 0) {
$retval = $a['suborder'] <=> $b['suborder'];
if ($retval == 0) {
$retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
}
}
return $retval;
});
si vous devez conserver les associations clés, utilisez uasort()
- voir comparaison des fonctions de tri des tableaux dans le manuel
function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
$sorter[$ii]=$va[$key];
}
asort($sorter);
foreach ($sorter as $ii => $va) {
$ret[$ii]=$array[$ii];
}
$array=$ret;
}
aasort($your_array,"order");
j'utilise cette fonction:
function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
$sort_col = array();
foreach ($arr as $key=> $row) {
$sort_col[$key] = $row[$col];
}
array_multisort($sort_col, $dir, $arr);
}
array_sort_by_column($array, 'order');
$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);
ceci s'occupe à la fois des alphabets majuscules et minuscules.
pour trier le tableau par la valeur de la "clé Titre" utilisation:
uasort($myArray, function($a, $b) {
return strcmp($a['title'], $b['title']);
});
strcmp comparez les cordes.
uasort () maintient les clés du tableau telles qu'elles ont été définies.
L'une des approches pour y parvenir serait la suivante
$new = [
[
'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
'title' => 'Flower',
'order' => 3,
],
[
'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
'title' => 'Free',
'order' => 2,
],
[
'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
'title' => 'Ready',
'order' => 1,
],
];
$keys = array_column($new, 'order');
$result = array_multisort($keys, SORT_ASC, $new);
résultat:
Array
(
[0] => Array
(
[hashtag] => e7d31fc0602fb2ede144d18cdffd816b
[title] => Ready
[order] => 1
)
[1] => Array
(
[hashtag] => b24ce0cd392a5b0b8dedc66c25213594
[title] => Free
[order] => 2
)
[2] => Array
(
[hashtag] => a7e87329b5eab8578f4f1098a152d6f4
[title] => Flower
[order] => 3
)
)
l'approche la plus souple consisterait à utiliser cette méthode
Arr::sortByKeys(array $array, $keys, bool $assoc = true): array
voici pourquoi:
-
vous pouvez trier par n'importe quelle clé (également emboîtée comme
'key1.key2.key3'
ou['k1', 'k2', 'k3']
) -
Fonctionne à la fois sur associatif et non pas des tableaux associatifs (
$assoc
drapeau) -
Il n'utilise pas de référence - retour nouveau tableau trié
dans votre cas, ce serait aussi simple que:
$sortedArray = Arr::sortByKeys($array, 'order');
cette méthode fait partie de cette bibliothèque .
avouons-le: php n'a pas une simple fonction "out of the box" pour gérer correctement chaque scénario de tri de tableaux.
cette routine est intuitive, ce qui signifie un débogage et une maintenance plus rapides:
// automatic population of array
$tempArray = array();
$annotations = array();
// ... some code
// SQL $sql retrieves result array $result
// $row[0] is the ID, but is populated out of order (comes from
// multiple selects populating various dimensions for the same DATE
// for example
while($row = mysql_fetch_array($result)) {
$needle = $row[0];
arrayIndexes($needle); // create a parallel array with IDs only
$annotations[$needle]['someDimension'] = $row[1]; // whatever
}
asort($tempArray);
foreach ($tempArray as $arrayKey) {
$dataInOrder = $annotations[$arrayKey]['someDimension'];
// .... more code
}
function arrayIndexes ($needle) {
global $tempArray;
if (!in_array($needle,$tempArray)) {
array_push($tempArray,$needle);
}
}