二维数组多字段排序.

2023-05-09 07:04:57   个人常用封装函数

 

  1. /**
  2. * 二维数组多字段排序.
  3. *
  4. * @param array $sort:['a'=>'desc','b'=>'asc','d'=>'desc']
  5. *
  6. * @return array
  7. */
  8. function sortArrByManyField(array $array, $sort = [])
  9. {
  10. if (!$sort) {
  11. return $array;
  12. }
  13. $array = array_values($array);
  14. for ($i=0; $i < count($array); ++$i) {
  15. foreach ($sort as $key => $order) {
  16. if (!isset($array[$i + 1])) {
  17. break 2;
  18. }
  19. if ('desc' == strtolower($order)) {
  20. $bool = $array[$i][$key] >= $array[$i + 1][$key];
  21. } else {
  22. $bool = $array[$i][$key] <= $array[$i + 1][$key];
  23. }
  24. if (!$bool) {
  25. foreach ($sort as $k => $o) {
  26. // 检查交换位置后,判断之前的大小关系结果是否依然成立,不再判断当前key,只比较$key之前的排序是否正确
  27. if ($k == $key) {
  28. break;
  29. }
  30. if ('desc' == strtolower($o)) {
  31. $bool = $array[$i + 1][$k] >= $array[$i][$k];
  32. } else {
  33. $bool = $array[$i + 1][$k] <= $array[$i][$k];
  34. }
  35. if (!$bool) {
  36. // 检查交换位置后,不再满足条件,不交换位置,继续$i+1的循环
  37. continue 2;
  38. }
  39. }
  40. // 检查交换位置后,判断之前的大小关系结果是否依然成立,不再判断当前key=>条件依然成立,互换位置
  41. $temp = $array[$i + 1];
  42. $array[$i + 1] = $array[$i];
  43. $array[$i] = $temp;
  44. $i = -1; // 控制循环指针,下次最外层依旧从0开始
  45. break;
  46. }
  47. }
  48. }
  49. return $array;
  50. }