1328 Stimmen

Wie man ein mehrdimensionales Array nach Wert sortiert

Wie kann ich dieses Array nach dem Wert des Schlüssels "order" sortieren?

Auch wenn die Werte derzeit sequenziell sind, werden sie es nicht immer sein.

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Blume
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Frei
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Bereit
            [order] => 1
        )
)

2000voto

Christian Studer Punkte 23702

Versuchen Sie es mit einer usort. Wenn Sie immer 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 ab PHP 7 den Raumschiffoperator verwenden:

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

Um dies auf multidimensionales Sortieren zu erweitern, verweisen Sie auf die zweiten/dritten Sortierelemente, wenn das erste Null ist - am besten unten erklärt. Sie können dies auch für das Sortieren von Unterlementen 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 die Schlüsselzuordnungen beibehalten müssen, verwenden Sie uasort() - siehe Vergleich der Array-Sortierfunktionen im Handbuch.

297voto

o0'. Punkte 11502
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");

294voto

Tom Haigh Punkte 56080

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

Bearbeiten Diese Antwort ist mindestens zehn Jahre alt, und es gibt wahrscheinlich jetzt bessere Lösungen, aber ich füge einige zusätzliche Informationen hinzu, wie in einigen Kommentaren angefordert.

Es funktioniert, weil array_multisort() mehrere Arrays sortieren kann. Beispiel Eingabe:

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )

Zuerst wird $sort_col erstellt, das ein zweidimensionales Array ist, wobei die Werte das sind, nach denen sortiert werden soll, und die Schlüssel mit dem Eingabearray übereinstimmen. Zum Beispiel für diese Eingabe, wenn der Schlüssel $sort_col "order" wählt, erhalten wir:

Array
(
    [0] => 3,
    [1] => 2
)

array_multisort() sortiert dann dieses Array (was zu der Schlüsselreihenfolge 1, 0 führt), aber dies ist nur das zweidimensionale Array. Daher wird auch das ursprüngliche Eingabearray als Argument $rest übergeben. Da die Schlüssel übereinstimmen, wird es so sortiert, dass auch seine Schlüssel in der gleichen Reihenfolge sind, was das gewünschte Ergebnis liefert.

Hinweis:

  • Es wird als Referenz übergeben, damit das bereitgestellte Array direkt geändert wird.
  • array_multisort() kann auf diese Weise nicht nur ein, sondern mehrere zusätzliche Arrays sortieren

112voto

ajuchacko91 Punkte 1289

Um dies zu erreichen, können wir die Methode "array_multisort" verwenden, die 'Mehrere oder mehrdimensionale Arrays sortiert'. Die Methodenparameter sind

  • $keys - ein zu sortierendes Array
  • SORT_ASC - Sortierreihenfolge (aufsteigend)
  • Sortierflags (Elemente normal vergleichen (Typen nicht ändern) oder numerisch oder als Strings)
  • $new - dann der Rest der Arrays. Nur Elemente, die den entsprechenden Elementen in den vorherigen Arrays entsprechen, werden verglichen.

'Sortierflags' ist standardmäßig SORT_REGULAR und wird ausgelassen.

$new = [
    [
        'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
        'title' => 'Blume',
        'order' => 3,
    ],
    [
        'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
        'title' => 'Frei',
        'order' => 2,
    ],
    [
        'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
        'title' => 'Bereit',
        'order' => 1,
    ],
];
$keys = array_column($new, 'order');
array_multisort($keys, SORT_ASC, $new);
var_dump($new);

Ergebnis:

Array
(
    [0] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Bereit
            [order] => 1
        )
    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Frei
            [order] => 2
        )
    [2] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Blume
            [order] => 3
        )
)

85voto

Jan Fabry Punkte 6892

Normalerweise verwende ich usort und übergebe meine eigene Vergleichsfunktion. In diesem Fall ist es sehr einfach:

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

In PHP 7 mit dem Spaceship-Operator:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X