Sortieren Sie ein mehrdimensionales Array absteigend nach der Anzahl der Subarrays und bewahren Sie die Schlüssel der ersten Ebene

Lesezeit: 3 Minuten

Benutzeravatar von Aviram
Aviram

Ich habe ein Array wie:

$array = [
    'DEF' => [
        ['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
        ['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
    ],
    'ABC' => [
        ['type' => 1, 'id' => 1234, 'name' => 'John Doe', 'current' => null],
    ],
    'WW' => [
        ['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
        ['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
        ['type' => 1, 'id' => 64646, 'name' => 'Floor', 'current' => null],
    ]
];

Und ich möchte dieses Array nach der Anzahl ( count() ) der Elemente des inneren Arrays absteigend sortieren (dh die meisten Elemente zuerst), also werde ich dieses Array haben:

[
    'WW' => [
        ['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
        ['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
        ['type' => 1, 'id' => 64646, 'name' => 'Floor', 'current' => null],
    ],
    'DEF' => [
        ['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
        ['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
    ],
    'ABC' => [
        ['type' => 1, 'id' => 1234, 'name' => 'John Doe', 'current' => null],
    ]
];

Kann jemand einen effizienten Weg vorschlagen, dies zu tun? Vielen Dank.

  • Warum nicht usort php.net/manual/en/function.usort.php ?

    – Josef Silber

    15. September 2011 um 15:42 Uhr

  • Bitte verwenden Sie var_export zum Sichern von Arrays

    – Arnaud Le Blanc

    15. September 2011 um 15:46 Uhr

Benutzeravatar von Arnaud Le Blanc
Arnaud Le Blanc

Verwenden uksort:

uksort($array, function($a, $b) { return count($b) - count($a); });

Verwenden array_multisort:

array_multisort(array_map('count', $array), SORT_DESC, $array);

Mit PHP < 5.3:

function sort_cb($a, $b) {
    return count($b) - count($a);
}
uksort($array, 'sort_cb');

  • Wenn Sie PHP < 5.3.0 verwenden, müssen Sie diese anonyme Funktion von dort entfernen.

    – NullUserException

    15. September 2011 um 15:47 Uhr

  • Sie sollten PHP < 5.3.0 nicht verwenden ;)

    – Arnaud Le Blanc

    15. September 2011 um 15:50 Uhr

  • Das Beispiel uksort() hat nicht funktioniert, da ich meine Array-Schlüssel verloren habe (‘ABC’,’DEF’,’WW’), aber das array_multisort() hat funktioniert — danke!

    – Aviram

    15. September 2011 um 15:54 Uhr

  • Sollte das nicht sein usort Anstatt von uksort?

    – Hirnhamster

    26. August 2014 um 14:33 Uhr

  • uksort sortiert nach Schlüsseln. Schlüssel können keine Arrays sein und count zählt nichts. usort vergleicht Werte, die Arrays sein können.

    – Grzegorz

    11. Mai 2018 um 11:15 Uhr

<?php
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return (count($a) > count($b)) ? -1 : 1;
}

$a = array(
"AA" => array(
        array('type'=>'1', 'id'=>'2'),
        array('type'=>'2', 'id'=>'2')),
'BB' => array(
        array('type'=>'1', 'id'=>'2'),
        array('type'=>'2', 'id'=>'2'),
        array('type'=>'5', 'id'=>'2')),
'CC' => array(
        array('type'=>'1', 'id'=>'2'))
);  

usort($a, "cmp");

print_r($a);
?>

  • Wenn Sie PHP 7 verwenden, können Sie das jetzt einfach tun count($a) <=> count($b); 🙂

    – Galdikas

    19. Juli 2017 um 5:53 Uhr


  • Das war genau das, was ich brauchte, danke.

    – Aaron

    9. Juni 2021 um 7:35 Uhr


$tempArr = $sortedArr = array();
foreach ($myArr as $k => $v) $tempArr[$k] = count($v);
asort($tempArr);
foreach ($tempArr as $k => $v) $sortedArr = $myArr[$k];

Beachten Sie, dass dies unterbrochen wird, wenn einer der Array-Werte selbst kein Array ist, Sie möchten vielleicht ein hinzufügen is_array() irgendwo nachschauen…

Wenn Sie sich nur um die Sortierung nach Größe und nicht um die tatsächliche Qualität sorgen, können Sie den einfachsten Ansatz verwenden, um absteigend zu sortieren und Schlüssel zu erhalten arsort().

Array mit weniger Mitgliedern ist kleiner, wenn der Schlüssel von Operand 1 nicht in Operand 2 gefunden wird, dann sind Arrays nicht vergleichbar, ansonsten – Wert für Wert vergleichen (siehe folgendes Beispiel)

Für den Fall, dass Sie mehrere Zeilen mit derselben Größe haben, werden sie basierend auf ihren tatsächlichen Daten weiter absteigend sortiert.

Code: (Demo)

arsort($array);
var_export($array);

1430640cookie-checkSortieren Sie ein mehrdimensionales Array absteigend nach der Anzahl der Subarrays und bewahren Sie die Schlüssel der ersten Ebene

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

Privacy policy