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 相关文章推荐
mysql 全文搜索 技巧
Apr 27 PHP
php 验证码实例代码
Jun 01 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
Jun 26 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
php封装的连接Mysql类及用法分析
Dec 10 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
PHP中Array相关函数简介
Jul 03 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
浅析PHP7的多进程及实例源码
Apr 14 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
2.PHP入门
2006/10/09 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
模拟select的代码
2011/10/19 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
介绍Python的Django框架中的QuerySets
2015/04/20 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
大学生个人推荐信范文
2013/11/25 职场文书
思想品德自我评价
2014/02/04 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
2014年村官工作总结
2014/11/24 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android