Comment puis-je trier ce tableau par la valeur de la clé "order"? Même si les valeurs sont actuellement séquentielles, elles ne le 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
)
)
Essayez un sort , Si vous êtes toujours sur PHP 5.2 ou version antérieure, vous devrez d'abord définir une fonction de tri:
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 étendre cela au tri multi-dimensionnel, référencez les deuxième/troisième éléments de tri si le premier est nul - mieux expliqué ci-dessous. Vous pouvez également l'utiliser pour trier 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 de touches, utilisez uasort()
- voir comparaison des fonctions de tri de 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');
J'utilise habituellement sort et passe ma propre fonction de comparaison. Dans ce cas, c'est très simple:
function compareOrder($a, $b)
{
return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');
Une approche 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');
array_multisort($keys, SORT_ASC, $new);
var_dump($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
)
)
$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);
Cela prend en charge les alphabets majuscules et minuscules.
Pour trier le tableau en fonction de la valeur de la clé "title", utilisez:
uasort($myArray, function($a, $b) {
return strcmp($a['title'], $b['title']);
});
strcmp compare les chaînes.
asort () conserve les clés du tableau telles qu'elles ont été définies.
L'approche la plus flexible serait d'utiliser cette méthode
Arr::sortByKeys(array $array, $keys, bool $assoc = true): array
voici pourquoi:
Vous pouvez trier par n'importe quelle clé (également imbriquée comme 'key1.key2.key3'
ou ['k1', 'k2', 'k3']
)
Fonctionne à la fois sur les tableaux associatifs et non associatifs (indicateur $assoc
Il n'utilise pas de référence - retourne un 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 .
Utilisez array_multisort (), array_map ()
array_multisort(array_map(function($element) {
return $element['order'];
}, $array), SORT_ASC, $array);
print_r($array);
Voyons les choses en face: php n'a pas une fonction simple prête à l'emploi pour gérer correctement chaque scénario de tri de tableau.
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);
}
}