Search code examples
phparrayssortingmultidimensional-arraycustom-sort

Sort 3d array by 1st level keys, then the 2nd level by lone 3rd level key


I have a multidimensional array like this:

[
    'user 1' => [
        ['item 4' => '11385'],
        ['item 2' => '144268'],
        ['item 1' => '65774'],
        ['item 9' => '98523'],
    ],
    'user 5' => [
        ['item 8' => '239233'],
    ],
    'user 2' => [
        ['item 4' => '53718'],
        ['item 1' => '154687'],
    ],
]

What I need to do is to simply sort my array first by users (first level keys), then by items (third level keys) ascending.

Desired result:

[
    'user 1' => [
        ['item 1' => '65774'],
        ['item 2' => '144268'],
        ['item 4' => '11385'],
        ['item 9' => '98523'],
    ],
    'user 2' => [
        ['item 1' => '154687'],
        ['item 4' => '53718'],
    ],
    'user 5' => [
        ['item 8' => '239233'],
    ],
]

Solution

  • ksort sorts by the key

    $newArray = array();
    
    # start by sorting users
    $yourArray = ksort($yourArray);
    
    # then sort sub items
    foreach($yourArray as $user=>$theirItems) {
        $theirItems = ksort($theirItems); # assuming you still want to sort by key;
        $newArray[$user] = $theirItems;
    }
    
    var_dump($newArray);
    

    Output: (Demo)

    Warning: foreach() argument must be of type array|object, true given