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写出自己的BLOG系统 2
Apr 12 PHP
php实现简单洗牌算法
Jun 18 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
codeigniter数据库操作函数汇总
Jun 12 PHP
php制作动态随机验证码
Feb 12 PHP
PHP和C#可共用的可逆加密算法详解
Oct 26 PHP
joomla数据库操作示例代码
Jan 06 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
解析PHP之提取多维数组指定列的方法
Jan 03 PHP
PHP实现的抓取小说网站内容功能示例
Jun 27 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
php中Swoole的热更新实现代码实例
Mar 04 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
多数据表共用一个页的新闻发布
2006/10/09 PHP
PHP6 先修班 JSON实例代码
2008/08/23 PHP
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
2015/08/13 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
详解如何运行vue项目
2019/04/15 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
python使用7z解压apk包的方法
2015/04/18 Python
python实现按行切分文本文件的方法
2016/04/18 Python
Python环境变量设置方法
2016/08/28 Python
Python生成随机密码的方法
2017/06/16 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
python根据多个文件名批量查找文件
2019/08/13 Python
python实现吃苹果小游戏
2020/03/21 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
董事长职责范文
2013/11/08 职场文书
学校运动会报道稿
2014/09/23 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
MySQL Server 层四个日志
2022/03/31 MySQL