usort sorting multiple fields
Is it possible to use usort
to sort multiple fields in a multidimensional array? For example, I want to sort name
alphabetically and then from those records I want to sort them by age
. Is this possible using sort
?
Array (
[0] => Array (
[name] => Jonah
[age] => 27
)
[1] => Array (
[name] => Bianca
[age] => 32
)
)
How about:
$arr = Array (
0 => Array (
'name' => 'Jonah',
'age' => '27',
),
1 => Array (
'name' => 'Bianca',
'age' => '32',
),
2 => Array (
'name' => 'Jonah',
'age' => '25',
),
3 => Array (
'name' => 'Bianca',
'age' => '35',
),
);
function comp($a, $b) {
if ($a['name'] == $b['name']) {
return $a['age'] - $b['age'];
}
return strcmp($a['name'], $b['name']);
}
usort($arr, 'comp');
print_r($arr);
output:
Array
(
[0] => Array
(
[name] => Bianca
[age] => 32
)
[1] => Array
(
[name] => Bianca
[age] => 35
)
[2] => Array
(
[name] => Jonah
[age] => 25
)
[3] => Array
(
[name] => Jonah
[age] => 27
)
)
usort($arr, function($a, $b)
{
$name = strcmp($a['name'], $b['name']);
if($name === 0)
{
return $a['age'] - $b['age'];
}
return $name;
});
How about:
<?php
function getRandomName() {
$possible = "ab";
$possible_len = strlen($possible);
$r = '';
for ($i = 0; $i < 4; $i++) {
$r .= substr($possible, mt_rand(0, $possible_len-1), 1);
}
return ucfirst($r);
}
$a = array();
for ($i = 0; $i < 10; $i++) {
$a[] = array('name' => getRandomName(), 'age' => rand(1,10), 'start_order' => $i);
}
$order = array('name' => 'desc', 'age' => 'asc');
print_r($a);
usort($a, function ($a, $b) use ($order) {
$t = array(true => -1, false => 1);
$r = true;
$k = 1;
foreach ($order as $key => $value) {
$k = ($value === 'asc') ? 1 : -1;
$r = ($a[$key] < $b[$key]);
if ($a[$key] !== $b[$key]) {
return $t[$r] * $k;
}
}
return $t[$r] * $k;
});
print_r($a);