php中二维数组排序问题方法详解


Posted in PHP onAugust 28, 2015

PHP中二维数组排序,可以使用PHP内置函数uasort()

示例一:

使用用户自定义的比较函数对数组中的值进行排序并保持索引关联

回调函数如下:注意回调函数的返回值是负数或者是false的时候,表示回调函数的第一个参数在前,第二个参数在后排列

$person = array(
  array('num'=>'001','id'=>6,'name'=>'zhangsan','age'=>21),
  array('num'=>'001','id'=>7,'name'=>'ahangsan','age'=>23),
  array('num'=>'003','id'=>1,'name'=>'bhangsan','age'=>23),
  array('num'=>'001','id'=>3,'name'=>'dhangsan','age'=>23),
);
//负数或者false表示第一个参数应该在前
function sort_by_name($x,$y){
  return strcasecmp($x['name'],$y['name']);
}

使用如下:

uasort($person,'sort_by_name');

下面给出一个二维数组排序的方法,供参考和面试使用:

//$array 要排序的数组
//$row  排序依据列
//$type 排序类型[asc or desc]
//return 排好序的数组
function array_sort($array,$row,$type){
  $array_temp = array();
  foreach($array as $v){
    $array_temp[$v[$row]] = $v;
  }
  if($type == 'asc'){
    ksort($array_temp);
  }elseif($type='desc'){
    krsort($array_temp);
  }else{
  }
  return $array_temp;
}

示例二:

一维数组排序可以使用asort、ksort等一些方法进程排序,相对来说比较简单。二维数组的排序怎么实现呢?使用array_multisort和usort可以实现

例如像下面的数组:

代码如下:

$users = array(
  array('name' => 'tom', 'age' => 20)
  , array('name' => 'anny', 'age' => 18)
  , array('name' => 'jack', 'age' => 22)
);

希望能按照age从小到大进行排序。笔者整理了两个方法出来,分享给大家。

1、使用array_multisort

使用这个方法,会比较麻烦些,要将age提取出来存储到一维数组里,然后按照age升序排列。具体代码如下:

代码如下:

$ages = array();
foreach ($users as $user) {
  $ages[] = $user['age'];
}
array_multisort($ages, SORT_ASC, $users);

执行后,$users就是排序好的数组了,可以打印出来看看。如果需要先按年龄升序排列,再按照名称升序排列,方法同上,就是多提取一个名称数组出来,最后的排序方法这样调用:

代码如下:

array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);

2、使用usort

使用这个方法最大的好处就是可以自定义一些比较复杂的排序方法。例如按照名称的长度降序排列:

代码如下:

usort($users, function($a, $b) {
      $al = strlen($a['name']);
      $bl = strlen($b['name']);
      if ($al == $bl)
        return 0;
      return ($al > $bl) ? -1 : 1;
    });

这里使用了匿名函数,如果有需要也可以单独提取出来。其中$a, $b可以理解为$users数组下的元素,可以直接索引name值,并计算长度,而后比较长度就可以了。

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

这里顺便说一下PHP排序的几个函数

sort 对数组排序一般适用于一维索引数组,不会保持索引

rsort 对数组逆向排序 和sort用法一致

asort 对数组进行排序并保持索引关系对值进行排序,一般适用于一维数组,保持索引关系

arsort 对数组进行逆向排序并保持索引关系和asort用法一致

ksort 对数组按照键名排序

krsort 对数组按照键名逆向排序

PHP 相关文章推荐
用户的详细注册和判断
Oct 09 PHP
php学习笔记 [预定义数组(超全局数组)]
Jun 09 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
通过php添加xml文档内容的方法
Jan 23 PHP
php简单实现短网址(短链)还原的方法(测试可用)
May 09 PHP
PHP数据库表操作的封装类及用法实例详解
Jul 12 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 #PHP
PHP生成随机密码方法汇总
Aug 27 #PHP
windows下apache搭建php开发环境
Aug 27 #PHP
php给图片添加文字水印方法汇总
Aug 27 #PHP
微信公众平台开发之配置与请求
Aug 26 #PHP
php基础教程
Aug 26 #PHP
php面向对象与面向过程两种方法给图片添加文字水印
Aug 26 #PHP
You might like
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
python 数据加密代码
2008/12/24 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
Collection和Collections的区别
2016/05/02 面试题
文明礼仪事迹材料
2014/01/09 职场文书
团队队名口号大全
2014/06/06 职场文书
2015年林业工作总结
2015/05/14 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
学校运动会开幕词
2016/03/03 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
MySQL 视图(View)原理解析
2021/05/19 MySQL
Java如何实现树的同构?
2021/06/22 Java/Android