二维数组重新排序

Posted yaradish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组重新排序相关的知识,希望对你有一定的参考价值。

php对一维数组排序,可能大家都很清楚,主要有以下几个:
sort() 对数组排序
rsort() 对数组逆向排序
asort()  保持索引关系
arsort() 逆向排序,并保持索引关系
ksort() 按键名排序
krsort() 按键名逆向排序
usort() 使用用户自定义的函数对数组进行排序
uksort() 使用用户自定义的函数对数组键名进行排序
natsort() 用自然排序算法对数组排序
natcasesort() 用自然排序算法对数组排序,不区分大小写
如果是多维数组或者对多个数组排序的话,PHP也提供了一个函数:array_multisort()
bool array_multisort ( array $ar1 [, mixed $arg [, mixed $... [, array $... ]]] ),成功返回true,失败返回false
使用说明:

关联(string)键名保持不变,但数字键名会被重新索引。 
输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。——这句话是理解此函数用法的关键。

第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。

排序顺序标志: 
■SORT_ASC - 按照上升顺序排序 
■SORT_DESC - 按照下降顺序排序

排序类型标志: 
■SORT_REGULAR - 将项目按照通常方法比较 
■SORT_NUMERIC - 将项目按照数值比较 
■SORT_STRING - 将项目按照字符串比较

每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。


案例一:对多个数组进行排序

  1. /**
  2. * 多个数组排序
  3. * @blog<http://www.phpddt.com>
  4. */
  5. $arr1 = array(1,9,5);
  6. $arr2 = array(6,2,4);
  7. $arr3 = array(3,7,8);
  8. array_multisort($arr1,$arr2,$arr3);
  9. print_r($arr1);
  10. print_r($arr2);
  11. print_r($arr3);


看以看到结果是:

  1. Array
  2. (
  3. [0] => 1
  4. [1] => 5
  5. [2] => 9
  6. )
  7. Array
  8. (
  9. [0] => 6
  10. [1] => 4
  11. [2] => 2
  12. )
  13. Array
  14. (
  15. [0] => 3
  16. [1] => 8
  17. [2] => 7
  18. )


很明显,array_multisort会先按第一个数组(想像成列)排序,如果第一个数组(列)的值相同,则按第二个数组(列)排序,一次类推。(个人见解:第一个数组排序之后,根据第一个数组的键(原先的键)顺序排序之后的数组(之后的数组没定义排序的情况下))
案例二:对多维数组排序(二维数组为例)

  1. /**
  2. * 多维数组排序
  3. * @blog<http://www.phpddt.com>
  4. */
  5. $arr = array(
  6. array(‘id‘=>1,‘data‘=>‘a‘),
  7. array(‘id‘=>3,‘data‘=>‘c‘),
  8. array(‘id‘=>2,‘data‘=>‘b‘),
  9. array(‘id‘=>2,‘data‘=>‘a‘)
  10. );
  11. $id = $data = array();
  12. foreach($arr as $key => $value){
  13. $id[$key] = $value[‘id‘];
  14. $data[$key] = $value[‘data‘];
  15. }
  16. array_multisort($id, SORT_ASC, $data, SORT_DESC, $arr);
  17. print_r($arr);


结果很显然:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [id] => 1
  6. [data] => a
  7. )
  8.  
  9. [1] => Array
  10. (
  11. [id] => 2
  12. [data] => b
  13. )
  14.  
  15. [2] => Array
  16. (
  17. [id] => 2
  18. [data] => a
  19. )
  20.  
  21. [3] => Array
  22. (
  23. [id] => 3
  24. [data] => c
  25. )
  26.  
  27. )


你可以对array_multisort()稍稍封装下更好用,如我:
 


  1. function sort_array($array, $keyid, $order=‘asc‘, $type=‘number‘) {
  2. if(is_array($array)) {
  3. foreach($array as $val) {
  4. $order_arr[] = $val[$keyid];
  5. }
  6. $order = ($order == ‘asc‘) ? SORT_ASC: SORT_DESC;
  7. $type = ($type == ‘number‘) ? SORT_NUMERIC: SORT_STRING;
  8. array_multisort($order_arr, $order, $type, $array);
  9. }
  10. }




























以上是关于二维数组重新排序的主要内容,如果未能解决你的问题,请参考以下文章

PHP按二维数组中的某个值重新排序数组 usort的使用方法

基于数组重新排序对象

python 二维数组排序

php 二维数组排序

二维数组快速排序(sort+qsort)

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )