Reputation: 677
Original Array:
[0] => Array
(
[name] => Light Amethyst
[description] => color
)
[1] => Array
(
[name] => Stone
[description] => base material
)
[2] => Array
(
[name] => Emerald
[description] => color
)
[3] => Array
(
[name] => Brass
[description] => base material
)
Applied usort($terms, "mysort");
via the following function(s)
function getSortOrder($c) {
$sortOrder = array(
"base material",
"color"
);
$pos = array_search($c['description'], $sortOrder);
return $pos !== false ? $pos : 99999;
}
function mysort($a, $b) {
if( getSortOrder($a) < getSortOrder($b) ) {
return -1;
}elseif( getSortOrder($a) == getSortOrder($b) ) {
return 0;
}else {
return 1;
}
}
This successfully ordered the array by the $sortOrder
array in the getSortOrder
function (base material first, and then color)
[0] => Array
(
[name] => Stone
[description] => base material
)
[1] => Array
(
[name] => Brass
[description] => base material
)
[2] => Array
(
[name] => Light Amethyst
[description] => color
)
[3] => Array
(
[name] => Emerald
[description] => color
)
Now I am trying to sort this new sorted array by name
while keeping the previously applied sort order (base material first and then color).
Expected Output:
[0] => Array
(
[name] => Brass
[description] => base material
)
[1] => Array
(
[name] => Stone
[description] => base material
)
[2] => Array
(
[name] => Emerald
[description] => color
)
[3] => Array
(
[name] => Light Amethyst
[description] => color
)
Normally I could apply a usort
function like such:
usort($people,"sort_name");
function sort_name($a,$b)
{
return $a["name"] > $b["name"];
}
But this is of course messing up the output of the original description
sort.
How can I sort first by description
as in the functions above, and then proceed to sort by name
while keeping the description
sort in tact?
Upvotes: 0
Views: 35
Reputation: 4701
You could use array_multisort to sort your original data in one go to the expected output (sort by description first, then name) like so
$data = [
['name' => 'Light Amethyst', 'description' => 'color'],
['name' => 'Stone', 'description' => 'base material'],
['name' => 'Emerald', 'description' => 'color'],
['name' => 'Brass', 'description' => 'base material']
];
array_multisort(array_column($data, 'description'), SORT_ASC, array_column($data, 'name'), SORT_ASC, $data);
$data
will now be sorted by description
first and name
second.
Upvotes: 1