Reputation: 340
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
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
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