I've an array of arrays.
$array = array(
['mb_id':'chris','mb_lv':1,'mb_point':150],
['mb_id':'chrit','mb_lv':1,'mb_point':160],
['mb_id':'chras','mb_lv':3,'mb_point':170],
['mb_id':'chrus','mb_lv':1,'mb_point':180]
)
How can I sort the value by mb_lv
asc, mb_point
asc, mb_id
asc? I tried array_multisort()
, but I ended up getting mixed up data.
Give it a try,
function array_orderby()
{
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
$sorted = array_orderby($array, 'mb_lv', SORT_DESC, 'mb_point', SORT_ASC,'mb_id',SORT_ASC);
Give it a try, it should work.
Here is working code link
$array = [
['mb_id' => 'chris','mb_lv' => 1,'mb_point' => 150],
['mb_id' => 'chrit','mb_lv' => 1,'mb_point' => 160],
['mb_id' => 'chras','mb_lv' => 3,'mb_point' => 170],
['mb_id' => 'chrus','mb_lv' => 1,'mb_point' => 180]
];
usort($array, function ($a, $b){
return ($a['mb_lv'] < $b['mb_lv']) ? -1 : 1;
});
var_dump($array);