以前比较少用这个函数,大部分自己接触的业务里,处理稍微大一些的数组的时候几乎都是从db里取出来的,在db里就order by了。

  最近倒是用了次,这个函数用来排序很强大,有点类似于sql中的order by,更像order by 后边有多个列名的时候(就是先以第一个列排序,然后再排第二列顺序这样)。这个函数尤其在多维数组排序的时候很有用。

php参考手册:http://php.net/manual/zh/function.array-multisort.php

手册里头这句话,对于理解这个函数的用法很重要:输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。

简单举个例子:

$arr1 = array(5,4,3,1,1);

$arr2 = array(1,2,3,4,5);

array_multisort($arr1, $arr2);

结果发现$arr1的顺序是1,1,3,4,5,$arr2的顺序是4,5,3,2,1。

排序时类似这样:把这两个数组倒过来,arr1、arr2是一张表的表头,如下所示。

arr1  arr2

5    1

4    2

3    3

1    4

1    5

它类似于sql中的  order by arr1, arr2 。。

按照arr1排序时,发现有两个1,那么则按照arr2排序,因为默认是按照升序排,所以arr2中的4这一行排在第一行位置,arr2中的5这一行排在第二行。

结果就是这样:

arr1  arr2

1    4

1    5

3    3

4    2

5    1

相信能明白了吧哈哈~

这个排序,会比较有用的地方在于多维数组的排序,来举个例子。

比如given一个数组是这样的,结果要按照title升序排,如果title一样,按照age降序排。

<?php

// 按照title升序,age降序 排列
$arr = array(
array(
'id' => 1,
'nickname' => 'James',
'title' => 'a',
'age' => 30,
),
array(
'id' => 2,
'nickname' => 'Wade',
'title' => 'b',
'age' => 31,
),
array(
'id' => 3,
'nickname' => 'Bosh',
'title' => 'c',
'age' => 32,
),
array(
'id' => 4,
'nickname' => 'Durant',
'title' => 'a',
'age' => 27,
),
array(
'id' => 5,
'nickname' => 'Howard',
'title' => 'b',
'age' => 32,
),
);

使用array_multisort()函数:

print_r($arr);

// 把参加排序的字段, 拆出来成各个数组
foreach($arr as $v){
$arr_title[] = $v['title'];
$arr_age[] = $v['age'];
} // 排序,注意最后一个参数是希望得到的结果
array_multisort($arr_title, SORT_ASC, $arr_age, SORT_DESC, $arr);// 函数中每个数组参数后面都可以加两个选项,是升/降序,按照数字/字符排序的选项 print_r($arr);

这里对比一下usort()函数的使用:

print_r($arr);

usort($arr, 'mysort');

function mysort($v1, $v2){
if($v1['title'] > $v2['title']){
return 1;
} else if ($v1['title'] < $v2['title']){
return -1;
} else { // 如果title相同,则比较age
if($v1['age'] > $v2['age']){
return -1;
} else if ($v1['age'] < $v2['age']){
return 1;
}
return 0;
}
} print_r($arr);

显然可以看出array_multisort()在对比这种多维数组的情况下更简洁。

接着上面的例子,又given一个case,比如说我希望按照age排序,但是我要指定一个顺序,而不是按照age数字的大小。

比如age按照32->27->30->31的顺序来排。

稍微有点经验的程序员就知道应该做一个映射,把这个指定的年龄顺序,映射一个有序的参照数组。

代码如下:

// 指定年龄顺序,映射一个有序的排序
$map = array(
32 => 'a',
27 => 'b',
30 => 'c',
31 => 'd',
);
$arr_age = array();// 这个就是参照数组
foreach($arr as $val){
$arr_age[] = $map[$val['age']];
}
array_multisort($arr_age, $arr);// 搞定

再举两个例子,这里就直接粘贴下手册里的两个例子,要好好理解,当然最后还是知道该什么时候用这个函数,怎么用它更高效了哈哈。

===============================

array_multisort函数,以及多维数组下排序的应用,并与usort函数对比的更多相关文章

  1. PHP数组函数 array_multisort() ----对多个数组或多维数组进行排序

    PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序. 关联(string)键名保持不变,但数字键名会被重新索引. 输入数组被当成一个表的列并以 ...

  2. PHP array_multisort—对多个数组或多维数组进行排序

    PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序. 关联(string)键名保持不变,但数字键名会被重新索引. 输入数组被当成一个表的列并以 ...

  3. array_multisort—对多个数组或多维数组进行排序

    From: http://www.cnblogs.com/lwbqqyumidi/archive/2013/01/31/2887188.html PHP中array_multisort可以用来一次对多 ...

  4. 代码分享:php对二维数组进行排序

    发布:net/PHP编程  编辑:thebaby   2013-06-28 13:12:54  [大 中 小] 转自:http://www.jbxue.com/article/9991.html本文介 ...

  5. php 根据指定的键对多维数组进行排序

    根据指定的键对多维数组排序,可以按照多个键排序 我们通常有一些多维数组需要排序: $guys = array( array( 'name' => 'jake', 'score' => 80 ...

  6. php 二维数组自定义排序

    eg1:只根据一个规则进行排序,比如我下面的数组是一组满减折扣的信息,我要按照满减的金额从小到大排序 代码: <?php $arr =[ ["amount"=> 60, ...

  7. php二维数组中的查找(善于利用基础函数)

    php二维数组中的查找(善于利用基础函数) 一.总结 真没必要完整的写函数,善于借用 1.array_search()是在以为数组中来找,现在我们要在二维数组数组中来,肯定要借用这个 2.!==fal ...

  8. java中二维数组的排序

    首先定义一个5X8的二维数组,然后使用随机数填充满.借助Arrays的方法对二维数组进行排序.参考思路:先把二维数组使用System.arraycopy进行数组复制到一个一维数组然后使用sort进行排 ...

  9. [C++ Primer Plus] 第7章、函数(一)程序清单——递归,指针和const,指针数组和数组指针,函数和二维数组

    程序清单7.6 #include<iostream> using namespace std; ; int sum_arr(int arr[], int n);//函数声明 void ma ...

随机推荐

  1. 前端开发笔记(2)css基础(上)

    CSS介绍 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS ...

  2. 记一次寻找appbug的问题

    公司规模 3000人以上 全国500强. 从总部刚交接过来的代码. 1.找不到代码.代码部分丢失.(由于没有交接,没有任何相关文档,花了一天确定代码丢失.从总部找到部分代码) 2.查找测试库,发现测试 ...

  3. Expo大作战(三)--针对已经开发过react native项目开发人员有针对性的介绍了expo,expo的局限性,开发时项目选型注意点等

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  4. springboot 学习之路 17(webflux 入门 (1))

    Webflux: webflux是在springboot2系列引入的技术:补充一些概念: 1> Reactive Streams 是 JVM 中面向流的库标准和规范: 处理可能无限数量的元素 按 ...

  5. SHELL调用存储过程

    1.测试用例 #!/bin/sh #日期变量可设成传入参数 #exec_date=`date +"%Y%m%d"` # -S 设置无提示模式, 该模式隐藏命令的 SQL*Plus ...

  6. 【转】Mysql学习---MySQL悲观锁中的排它锁

    [原文]https://www.toutiao.com/i6595305814087434760/ 悲观锁中的排它锁. 排它锁关键字:for update 特点:会锁住行或者表,防止其他事务进行修改操 ...

  7. XtraEditors七、ProgressBarControl、MarqueeProgressBarControl、ProgressPanel控件

    一.ProgressBarControl 进度条控件 效果如下: 示例代码: using System; using System.Collections.Generic; using System. ...

  8. spark任务调度和资源分配

    Spark调度模式 FIFO和FAIR     Spark中的调度模式主要有两种:FIFO和FAIR.    默认情况下Spark的调度模式是FIFO(先进先出),谁先提交谁先执行,后面的任务需要等待 ...

  9. [eclipse]添加python默认模板,在首行添加编码方式(# -*- coding: utf-8 -*-)

    1.从eclipse的windows->preference 2.参照如下图,添加指定的utf-8编码方式

  10. Algorithms: 二叉平衡树(AVL)

    二叉平衡树(AVL):   这个数据结构我在三月份学数据结构结构的时候遇到过.但当时没调通.也就没写下来.前几天要用的时候给调好了!详细AVL是什么,我就不介绍了,维基百科都有.  后面两月又要忙了. ...