Marcin Jaworski
Marcin Jaworski

Reputation: 340

How can I sort the sub arrays from a multidimensional array by keys?

I have this array for example:

$exampleArray = array (
                    array( 'Name' => 'Opony', 'Kod' =>'OPO',  'Price' => 100 ),
                    array( 'Kod' =>'OLE', 'Name' => 'Olej', 'Price' => 20 ),
                    array( 'Kod' =>'ABC', 'Price' => 20, 'Name' => 'abcdefg' )
                )

Keys in sub array are in random order. I want to sort the sub arrays by key:

Array
(
    [0] => Array
        (
            [Kod] => OPO
            [Name] => Opony
            [Price] => 100
        )
    [1] => Array
       (
            [Kod] => OLE
            [Name] => Olej
            [Price] => 20
       )

I try this:

function compr($x,$y){
  if($x == $y)
     return 0;
  elseif($x>$y)
     return 1;
  elseif($x<$y)
    return-1;
}

uksort($exampleArray, 'compr');

print_r($exampleArray);

But this code doesn't give me my expected result, what is wrong, how can I solve it?

Upvotes: 1

Views: 108

Answers (2)

mickmackusa
mickmackusa

Reputation: 47894

There is ABSOLUTELY no reason to call a user-defined sorting algorithm (uksort()) here.

Just call ksort() on each row.

Code: (Demo)

foreach ($array as &$row) {
    ksort($row);
}
var_export($array);

Or (Demo)

array_walk($array, fn(&$row) => ksort($row));
var_export($array);

Or (Demo)

function keySortRow(array $row): array {
    ksort($row);
    return $row;
}

var_export(
    array_map('keySortRow', $array)
);

Upvotes: 0

Rizier123
Rizier123

Reputation: 59681

This should work for you:

Just loop through all of your inner Arrays by reference and then just use uksort() with strcasecmp() to sort your inner Arrays by the keys.

foreach($exampleArray as &$v) {
    uksort($v, function($a, $b){
        return strcasecmp($a, $b);
    });
}

unset($v); //So if you use $v later it doesn't change the last element of the array by reference

output:

Array
(
    [0] => Array
        (
            [Kod] => OPO
            [Name] => Opony
            [Price] => 100
        )
    //...
    [2] => Array
        (
            [Kod] => ABC
            [Name] => abcdefg
            [Price] => 20
        )

)

Upvotes: 2

Related Questions