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 相关文章推荐
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 PHP
日常整理PHP中简单的图形处理(经典)
Oct 26 PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 PHP
php单例模式的简单实现方法
Jun 10 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
PHP中关键字interface和implements详解
Jun 14 PHP
Thinkphp5结合layer弹窗定制操作结果页面
Jul 07 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
PDO::errorCode讲解
Jan 28 PHP
laravel orm 关联条件查询代码
Oct 21 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 file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
php输出图像的方法实例分析
2017/02/16 PHP
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
学习Node.js模块机制
2016/10/17 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
极简的Python入门指引
2015/04/01 Python
python实现备份目录的方法
2015/08/03 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
python爬取哈尔滨天气信息
2018/07/14 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
Linux开机引导的步骤是什么
2014/02/26 面试题
大学生求职简历的自我评价
2013/10/21 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
五年级学生评语大全
2014/12/26 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
Tomcat配置访问日志和线程数
2022/05/06 Servers
springboot实现string转json json里面带数组
2022/06/16 Java/Android