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
        )
)
911
demandé sur Francesco 2010-04-23 17:54:26

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

1413
répondu Christian Studer 2018-09-15 00:36:02
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");
268
répondu o0'. 2010-04-23 13:57:03

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');
248
répondu Tom Haigh 2010-04-23 14:03:47

j'utilise habituellement usort , et passer 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');
65
répondu Jan Fabry 2016-02-16 06:36:40
$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.

14
répondu Nitrodbz 2012-02-22 21:05:12

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.

6
répondu B.K 2018-03-13 10:40:39

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
            )

    )
2
répondu ajuchacko91 2018-07-04 13:30:26

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 .

1
répondu Minwork 2018-09-06 18:10:57

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);
    }
}
0
répondu tony gil 2018-04-03 16:26:04