多维(二维)数组排序的实现

Crasph彬 148 0

     今天在工作中有一个需求,需要对查询出来的多维数组数据按照某个字段进行排序,搜索手册,发现array_mutilsort函数,简直神器,瞬间解决了一个大问题。下面安利一下这个函数的使用。
    函数学习依旧分三步,定义、参数、返回值。

定义

首先先看函数的定义,如下:

bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] );

array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
关联(string)键名保持不变,但数字键名会被重新索引。

参数

$array1 :  要排序的数组,此处&可以看出,排序后改变原数组
$sort_order : 排序方式,有SORT_DESC,SORT_ASC两种,默认为SORT_ASC
$sort_flags : 排序标志,常用有如下三种:

  • SORT_REGULAR - 将项目按照通常方法比较(不修改类型)

  • SORT_STRING - 按照字符串比较

  • SORT_NUMERIC - 按照数字大小比较

默认为SORT_REGULAR
其中sort_order,sort_flags可以省略且顺序可以互换。
排序的数组可以有多个。每个数组都可以定义自己的order和flag。

返回值

返回值为true和false,排序成功返回true,失败为false。

测试

ok,定义、参数、返回值看完了,我们就可以开始试验了。首先,数组的size必须是一样的,否则会报错。定义如下数组:

$arr1 = [1,6,10,54,35];
$arr2 = [1,2,3,4,5];
array_multisort($arr1,$arr2);
dump($arr1);
halt($arr2);

输出结果如下:

array(5) {
  [0] => int(1)
  [1] => int(6)
  [2] => int(10)
  [3] => int(35)
  [4] => int(54)
}
array(5) {
  [0] => int(1)
  [1] => int(2)
  [2] => int(3)
  [3] => int(5)
  [4] => int(4)
}

     多改变几次参数试验一下,可以得出一下结论:
     $arr2与$arr1的位置是一一对应的,$arr2的顺序会根据$arr1排序后位置的变动进行变动。即,$arr1的1对应$arr2里的1,$arr1的6对应$arr2里的2……依次类推,$arr1里的35对应$arr2里的5,经array_mutilsort函数操作后,$arr1的顺序进行变化,此时$arr2里也会根据与$arr1里的对应关系进行变动,对应关系与之前相同。(大致如此,表述可能不清楚……)
接上述,有了以上的推论,我们就可以对多维的数组进行排序了。我们排序的数组为$data,排序的字段为按照id降序,按照name升序。定义如下:

$data = [
   ['id' => 1 , 'sort' => 10 , 'name' => 'ab'],
    ['id' => '12' , 'sort' => 13 , 'name' => 'ba'],
   ['id' => 5 , 'sort' => 19 , 'name' => 'ac'],
   ['id' => 3 , 'sort' => 15 , 'name' => 'cd'],
   ['id' => 3 , 'sort' => 15 , 'name' => 'dg']
];
$id   = [];
$name = [];
foreach($data as $key => $val){
  $id[$key] = $val['id'];
  $name[$key] = $val['name'];
}
array_multisort($id,SORT_DESC,$name,SORT_ASC,$data);

首先我们先对id,name处理,处理成类似$arr1的形式,使用array_mutisort先进行$id的逆向排序后,$name在$id排序的基础上进行正想排序,然后$data排序就完成了。就相当于,$data在$id进行排序的时候以相同的动作进行移动后又按照$name的顺序移动。(跟这个移动杠上了)。上述的结果为:

array(5) {
  [0] => array(3) {
    ["id"] => string(2) "12"
    ["sort"] => int(13)
    ["name"] => string(2) "ba"
  }
  [1] => array(3) {
    ["id"] => int(5)
    ["sort"] => int(19)
    ["name"] => string(2) "ac"
  }
  [2] => array(3) {
    ["id"] => int(3)
    ["sort"] => int(15)
    ["name"] => string(2) "cd"
  }
  [3] => array(3) {
    ["id"] => int(3)
    ["sort"] => int(15)
    ["name"] => string(2) "dg"
  }
  [4] => array(3) {
    ["id"] => int(1)
    ["sort"] => int(10)
    ["name"] => string(2) "ab"
  }
}

好了,就这样吧,表述的有点绕哦。

支付宝打赏
微信打赏
发表评论
表情 图片 链接 代码

分享
微信
微博
QQ