二维数组多字段排序

2021-04-13 06:07:45   php分享记录

  个人常用函数  

因为项目需求,萌生了写一个根据多个字段进行二维数组排序函数的想法,网上查找了下,全都是使用array_multisort实现的,遂自己写了一个不使用array_multisort函数的实现方式

  1. 使用eval判断大小,好处是代码少一些

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

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