note 121037 deleted from function.usort by crell
| From: | crell@php.net | Date: | Thu, 31 Mar 2022 16:33:34 +0000 |
| Subject: | note 121037 deleted from function.usort by crell | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-217833@lists.php.net to get a copy of this message | ||
Note Submitter: 121616591 at qq dot com
----
You can also sort multi-dimensional array for multiple values like as
<?php
$arr = array(
array('id'=>1, 'age'=>1, 'sex'=>6,
'name'=>'a'),
array('id'=>2, 'age'=>3, 'sex'=>1,
'name'=>'c'),
array('id'=>3, 'age'=>3, 'sex'=>1,
'name'=>'b'),
array('id'=>4, 'age'=>2, 'sex'=>1,
'name'=>'d'),
);
print_r(arrayOrderBy($arr, 'age asc,sex asc,name desc'));
function arrayOrderBy(array &$arr, $order = null) {
if (is_null($order)) {
return $arr;
}
$orders = explode(',', $order);
usort($arr, function($a, $b) use($orders) {
$result = array();
foreach ($orders as $value) {
list($field, $sort) = array_map('trim', explode(' ', trim($value)));
if (!(isset($a[$field]) && isset($b[$field]))) {
continue;
}
if (strcasecmp($sort, 'desc') === 0) {
$tmp = $a;
$a = $b;
$b = $tmp;
}
if (is_numeric($a[$field]) && is_numeric($b[$field]) ) {
$result[] = $a[$field] - $b[$field];
} else {
$result[] = strcmp($a[$field], $b[$field]);
}
}
return implode('', $result);
});
return $arr;
}
?>
output:
Array
(
[0] => Array
(
[id] => 1
[age] => 1
[sex] => 6
[name] => a
)
[1] => Array
(
[id] => 4
[age] => 2
[sex] => 1
[name] => d
)
[2] => Array
(
[id] => 2
[age] => 3
[sex] => 1
[name] => c
)
[3] => Array
(
[id] => 3
[age] => 3
[sex] => 1
[name] => b
)
)