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的开合式多级菜单程序
Oct 09 PHP
一个php作的文本留言本的例子(六)
Oct 09 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
php计算当前程序执行时间示例
Apr 24 PHP
php中数字0和空值的区别分析
Jun 05 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
yii通过小物件生成view的方法
Oct 08 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
Laravel框架实现文件上传的方法分析
Sep 29 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
jQuery前台数据获取实现代码
2011/03/16 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
了解重排与重绘
2019/05/29 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
python实现排序算法解析
2018/09/08 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
softmax及python实现过程解析
2019/09/30 Python
python中property和setter装饰器用法
2019/12/19 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
pytorch实现查看当前学习率
2020/06/24 Python
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
中专毕业生个人职业生涯规划
2014/02/19 职场文书
小学老师对学生的评语
2014/12/29 职场文书
国家助学金感谢信
2015/01/21 职场文书
婚前保证书范文
2015/02/28 职场文书
2015年小学生暑假总结
2015/07/13 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python