Frage Sortiert mehrdimensionales Array nach Wert


Wie kann ich dieses Array nach dem Wert des "order" Schlüssels sortieren? Auch wenn die Werte momentan sequentiell sind, werden sie nicht immer sein.

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
        )
)

888
2018-04-23 13:54


Ursprung


Antworten:


Probieren Sie eine usort, Wenn Sie noch PHP 5.2 oder früher verwenden, müssen Sie zuerst eine Sortierfunktion definieren:

function sortByOrder($a, $b) {
    return $a['order'] - $b['order'];
}

usort($myArray, 'sortByOrder');

Ab PHP 5.3 können Sie eine anonyme Funktion verwenden:

usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

Und schließlich können Sie mit PHP 7 den "Raumschiffoperator" verwenden:

usort($myArray, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

Um dies auf mehrdimensionale Sortierung auszudehnen, referenzieren Sie das zweite / dritte Sortierelement, wenn das erste Null ist - am besten unten erklärt. Sie können dies auch zum Sortieren von Unterelementen verwenden.

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;
});

Wenn Sie Schlüsselzuordnungen beibehalten müssen, verwenden Sie uasort() - sehen Vergleich von Array-Sortierfunktionen in der Bedienungsanleitung


1376
2018-04-23 14:04



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");

266
2018-04-23 13:57



Ich benutze diese Funktion:

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');

246
2018-04-23 14:03



Ich benutze normalerweise usortund überlasse meine eigene Vergleichsfunktion. In diesem Fall ist es sehr einfach:

function compareOrder($a, $b)
{
  return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');

65
2018-04-23 14:04



$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);

Dies kümmert sich um Groß- und Kleinbuchstaben.


14
2018-02-22 20:59



Um das Array nach dem Wert des "title" Schlüssels zu sortieren, verwenden Sie:

uasort($myArray, function($a, $b) {
    return strcmp($a['title'], $b['title']);
});

strcmp vergleiche die Strings.

uasort () verwaltet die Array-Schlüssel so, wie sie definiert wurden.


3
2018-03-13 10:35



Let's face it: php hat keine einfache out-of-the-box-Funktion, um jedes Array-Sortier-Szenario richtig zu behandeln.

Diese Routine ist intuitiv, was eine schnellere Fehlersuche und Wartung bedeutet:

// 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
2018-04-03 11:36



Ein Ansatz, um dies zu erreichen, wäre so

    $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);

Ergebnis:

    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
            )

    )

0
2017-07-04 13:30