/**
* 二维数组多字段排序.
*
* @param array $sort:['a'=>'desc','b'=>'asc','d'=>'desc']
*
* @return array
*/
function sortArrByManyField(array $array, $sort = [])
{
if (!$sort) {
return $array;
}
$array = array_values($array);
for ($i=0; $i < count($array); ++$i) {
foreach ($sort as $key => $order) {
if (!isset($array[$i + 1])) {
break 2;
}
if ('desc' == strtolower($order)) {
$bool = $array[$i][$key] >= $array[$i + 1][$key];
} else {
$bool = $array[$i][$key] <= $array[$i + 1][$key];
}
if (!$bool) {
foreach ($sort as $k => $o) {
// 检查交换位置后,判断之前的大小关系结果是否依然成立,不再判断当前key,只比较$key之前的排序是否正确
if ($k == $key) {
break;
}
if ('desc' == strtolower($o)) {
$bool = $array[$i + 1][$k] >= $array[$i][$k];
} else {
$bool = $array[$i + 1][$k] <= $array[$i][$k];
}
if (!$bool) {
// 检查交换位置后,不再满足条件,不交换位置,继续$i+1的循环
continue 2;
}
}
// 检查交换位置后,判断之前的大小关系结果是否依然成立,不再判断当前key=>条件依然成立,互换位置
$temp = $array[$i + 1];
$array[$i + 1] = $array[$i];
$array[$i] = $temp;
$i = -1; // 控制循环指针,下次最外层依旧从0开始
break;
}
}
}
return $array;
}