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开发工具之vs2005图解
Jan 12 PHP
PHP程序员基本要求和必备技能
May 09 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
js代码实现微博导航栏
Jul 30 PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
php魔术方法功能与用法实例分析
Oct 19 PHP
php技巧小结【推荐】
Jan 19 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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和MySQL保存和输出图片
2006/10/09 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
python求质数的3种方法
2018/09/28 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
小学教师的个人自我鉴定
2013/10/24 职场文书
经理职责范文
2013/11/08 职场文书
会计与审计毕业生自荐信范文
2013/12/30 职场文书
幼儿园家长评语
2014/02/10 职场文书
财务会计自荐信范文
2014/02/21 职场文书
学习两会精神心得范文
2014/03/17 职场文书
中学生演讲稿
2014/04/26 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
珍爱生命主题班会
2015/08/13 职场文书