So sortieren Sie ein mehrdimensionales Array nach Wert

Lesezeit: 6 Minuten

So sortieren Sie ein mehrdimensionales Array nach Wert
Stefan

Wie kann ich dieses Array nach dem Wert des Schlüssels “Bestellung” sortieren?

Auch wenn die Werte derzeit sequenziell sind, wird dies nicht immer der Fall sein.

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            How to Sort a Multi-dimensional Array by Value => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            How to Sort a Multi-dimensional Array by Value => Free
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            How to Sort a Multi-dimensional Array by Value => Ready
            [order] => 1
        )
)

  • Cross-Linked: Referenz: Alle grundlegenden Methoden zum Sortieren von Arrays und Daten in PHP

    – hakre

    30. Oktober 2013 um 9:48 Uhr

  • Am schnellsten geht es mit der Isomorphie sort-array Modul, das sowohl im Browser als auch im Knoten nativ funktioniert und alle Arten von Eingaben, berechneten Feldern und benutzerdefinierten Sortierreihenfolgen unterstützt.

    – Lloyd

    21. Oktober 2019 um 20:26 Uhr

1647094448 188 So sortieren Sie ein mehrdimensionales Array nach Wert
Christian Studer

Versuchen Sie a usort. Wenn Sie noch auf PHP 5.2 oder früher sind, 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 Raumschiff-Operator verwenden:

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

Um dies auf eine mehrdimensionale Sortierung zu erweitern, referenzieren Sie das zweite/dritte Sortierelement, wenn das erste null ist – am besten unten erklärt. Sie können dies auch zum Sortieren nach 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 im Handbuch.

  • Wenn Sie eine Fallback-/Tiebreaker-Sortierung ohne Funktionsaufrufe zum Vorbereiten von Werten benötigen, deklarieren Sie ein Array von Regeln auf beiden Seiten eines einzelnen Raumschiffoperators. 1 2 Wenn nachfolgende Sortierregeln funktionalen Overhead beinhalten, verwenden Sie die ?: (ternärer Operator) zwischen nachfolgenden Raumschiff-Operatorvergleichen. 3, damit keine unnötigen Zusatzfunktionen aufgerufen werden.

    – mickmackusa

    7. Dezember 2020 um 22:17 Uhr


1647094448 772 So sortieren Sie ein mehrdimensionales Array nach Wert
o0′.

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

  • Dieser Antwort fehlt ihre pädagogische Erklärung.

    – mickmackusa

    7. Dezember 2020 um 21:32 Uhr

  • Eine Schleife, dann eine native Sortierung, dann eine weitere Schleife? Sicherlich nicht das eleganteste oder leistungsfähigste Snippet auf der Seite.

    – mickmackusa

    7. Dezember 2020 um 22:03 Uhr


  • Eine Erklärung wäre angebracht.

    – Peter Mortensen

    6. Juni 2021 um 22:34 Uhr

So sortieren Sie ein mehrdimensionales Array nach Wert
Tom Haigh

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

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

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

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            How to Sort a Multi-dimensional Array by Value => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            How to Sort a Multi-dimensional Array by Value => Free
            [order] => 2
        )

Zuerst $sort_col erstellt, bei dem es sich um ein zweidimensionales Array mit den Werten handelt, nach denen wir sortieren möchten, und den Schlüsseln, die mit dem Eingabearray übereinstimmen. Wählen Sie zum Beispiel für diese Eingabe die Taste aus $sort_col "order" wir bekommen:

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

array_multisort() sortiert dann dieses Array (was zu einer Schlüsselreihenfolge führt 1, 0), aber dies ist nur das zweidimensionale Array. Das ursprüngliche Eingabearray wird also auch als übergeben $rest Streit. Wenn die Schlüssel übereinstimmen, wird es sortiert, sodass seine Schlüssel auch in der gleichen Reihenfolge sind, was das gewünschte Ergebnis ergibt.

Notiz:

  • Es wird als Referenz übergeben, sodass das bereitgestellte Array an Ort und Stelle geändert wird.
  • array_multisort() kann mehrere zusätzliche Arrays wie dieses sortieren, nicht nur eines

  • Dieser Antwort fehlt ihre pädagogische Erklärung.

    – mickmackusa

    7. Dezember 2020 um 21:32 Uhr

  • Eine Erklärung wäre angebracht. ZB, was ist die Idee/der Kern? Was sind die Kompromisse im Vergleich zu anderen Lösungen? Was sind die Leistungsmerkmale, sowohl theoretische als auch tatsächliche Beispiele für Leistungsmessungen? Ist dieser Lösungshund zum Beispiel langsam oder nicht?

    – Peter Mortensen

    6. Juni 2021 um 22:36 Uhr


1647094449 910 So sortieren Sie ein mehrdimensionales Array nach Wert
ajuchacko91

Um dies zu erreichen, können wir “array_multisort“-Methode, die mehrere oder mehrdimensionale Arrays sortiert. Ihre Methodenparameter sind

  • $keys – ein Array, das sortiert wird
  • SORT_ASC – Sortierreihenfolge (aufsteigend)
  • Sortierkennzeichen (Elemente normal vergleichen (Typen nicht ändern) oder numerisch oder als Zeichenfolgen)
  • $new – dann Rest der Arrays. Nur Elemente, die äquivalenten Elementen im Vorhergehenden entsprechen
    Arrays werden verglichen.

‘sort flags’ ist standardmäßig SORT_REGULAR und wird weggelassen.

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

Ergebnis:

Array
(
    [0] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            How to Sort a Multi-dimensional Array by Value => Ready
            [order] => 1
        )
    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            How to Sort a Multi-dimensional Array by Value => Free
            [order] => 2
        )
    [2] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            How to Sort a Multi-dimensional Array by Value => Flower
            [order] => 3
        )
)

1647094450 242 So sortieren Sie ein mehrdimensionales Array nach Wert
Jan Fabry

Ich benutze normalerweise usort, und übergebe meine eigene Vergleichsfunktion. In diesem Fall ist es ganz einfach:

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

In PHP 7 mit dem Raumschiffoperator:

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

  • Es funktioniert danke, wie wäre es mit DESC?

    – Mess

    20. September 2021 um 9:02 Uhr

  • @Meas für die DESC-Sortierung kehren Sie die Position von um a und das b im Verhältnis zu <=>. Siehe diese Antwort.

    – mickmackusa

    28. Januar um 22:00 Uhr

1647094450 160 So sortieren Sie ein mehrdimensionales Array nach Wert
Peter Mortensen

Um das Array nach dem Wert des Schlüssels “Titel” zu sortieren, verwenden Sie:

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

strcmp Vergleiche die Saiten.

uasort() behält die Array-Schlüssel so bei, wie sie definiert wurden.

  • Es funktioniert danke, wie wäre es mit DESC?

    – Mess

    20. September 2021 um 9:02 Uhr

  • @Meas für die DESC-Sortierung kehren Sie die Position von um a und das b im Verhältnis zu <=>. Siehe diese Antwort.

    – mickmackusa

    28. Januar um 22:00 Uhr

So sortieren Sie ein mehrdimensionales Array nach Wert
shazyriver

Verwenden array_multisort(), array_map()

array_multisort(array_map(function($element) {
      return $element['order'];
  }, $array), SORT_ASC, $array);

print_r($array);

DEMO

  • Beachten Sie, dass dieser Ansatz eine Benachrichtigung ausgibt. array_multisort verweist auf seinen ersten Parameter.

    – Kami Yang

    22. April 2020 um 11:42 Uhr

  • @Kami im vorgefertigten Demo-Link gibt es keinen Beweis für Ihre Behauptung. Ich würde diese Antwort nicht verwenden, weil array_column() ist treffender/prägnanter.

    – mickmackusa

    20. November 2020 um 11:28 Uhr


  • Dies ist eine weniger raffinierte Version der zuvor geposteten Antwort von ajuchacko91.

    – mickmackusa

    7. Dezember 2020 um 21:37 Uhr

993890cookie-checkSo sortieren Sie ein mehrdimensionales Array nach Wert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy