wake-up-neo.com

So sortieren Sie mehrdimensionale Arrays nach Wert

Wie kann ich dieses Array nach dem Wert des Schlüssels "order" sortieren? Obwohl die Werte derzeit sequentiell sind, sind sie es nicht immer.

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

Versuchen Sie es mit einem sort Wenn Sie noch mit PHP 5.2 oder früher arbeiten, 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 Operator Raumschiff verwenden:

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

Um dies auf die 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 die Tastenzuordnungen beibehalten müssen, verwenden Sie uasort() - siehe Vergleich der Array-Sortierfunktionen im Handbuch

1584
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");
275
o0'.

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');
259
Tom Haigh

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

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

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

    array_multisort($keys, SORT_ASC, $new);

    var_dump($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
            )

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

Dies berücksichtigt sowohl Groß- als auch Kleinbuchstaben.

15
Nitrodbz

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

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

strcmp vergleiche die Strings.

asort () behält die definierten Array-Schlüssel bei.

10
B.K

Der flexibelste Ansatz wäre die Verwendung dieser Methode

Arr::sortByKeys(array $array, $keys, bool $assoc = true): array

hier ist der Grund:

  • Sie können nach jedem Schlüssel sortieren (auch verschachtelt wie 'key1.key2.key3' oder ['k1', 'k2', 'k3'])

  • Funktioniert sowohl mit assoziativen als auch nicht assoziativen Arrays ($assoc Flag)

  • Referenz wird nicht verwendet - neues sortiertes Array zurückgeben

In Ihrem Fall wäre es so einfach wie:

$sortedArray = Arr::sortByKeys($array, 'order');

Diese Methode ist Teil von diese Bibliothek .

2
Minwork

Verwenden Sie array_multisort (), array_map ()

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

print_r($array);

DEMO

2

Seien wir ehrlich: PHP hat KEINE einfache Out-of-the-Box-Funktion, um jedes Array-Sortier-Szenario richtig zu handhaben.

Diese Routine ist intuitiv, was ein schnelleres Debugging und eine schnellere 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
tony gil