PHP多维数组指定多字段排序的示例代码


Posted in PHP onMay 16, 2018

介绍array_multisort方法

array_multisort — 对多个数组或多维数组进行排序.其php 手册中的说明如下:

bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )

参数

arr
要排序的一个 array。

arg
接下来的每个参数可以是另一个 array 或者是为之前 array 排序标志选项参数: SORT_ASC, SORT_DESC,SORT_REGULAR, SORT_NUMERIC, SORT_STRING.

Additional arg's.

先实现指定多维数组一个字段排序

此处要求根据其中的一个字段来对数组进行排序,数组假设如下:

$array = array(
      0=>array('id'=>8,'name'=>'Tom'),
      1=>array('id'=>9,'name'=>'Peter'),
      2=>array('id'=>5,'name'=>'Jack')
  );

我们要根据二维数组的id值来排序,转换后的数组格式如下:

$array = array(
      0=>array('id'=>5,'name'=>'Jack')
      1=>array('id'=>8,'name'=>'Tom'),
      2=>array('id'=>9,'name'=>'Peter')
  );

要完成上述的转换,需要用到上面介绍的array_multisort函数,如下:

function sortArrByOneField(&$array, $field, $desc = false){
    $fieldArr = array();
    foreach ($array as $k => $v) {
     $fieldArr[$k] = $v[$field];
    }
    $sort = $desc == false ? SORT_ASC : SORT_DESC;
    array_multisort($fieldArr, $sort, $array);
  }

通过将待排序数组的各个数组的$field保存在一位数组fieldArr中,在传入array_multisort中参与排序。其中field数组的值如下:

array(0=>8,1=>9,2=>5)

传入 array_multisort后,相当于对$field一维数组的排序,而后根据排序后的key重新构建传入的待排序数组。

实现多维数组的指定多个字段排序

上面的实例讲解了如何实现多维数组指定一个字段排序,但如果要实现指定多个字段来对数组进行排序该如何思考?
多个字段是几个?2个,3个或更多,所以这个不确定的因素需要排除。

我们先来看2指定2个字段进行排序的方案:

$arr = array(
    '0' => array(
      'id' => 3,
      'age' => 27 
    ),
    '1' => array(
      'id' => 5,
      'age' => 50
    ),
    '2' => array(
      'id' => 4,
      'age' => 44
    ),
    '3' => array(
      'id' => 3,
      'age' => 78
    ) 
  );
  foreach ( $arr as $key => $row ){
    $id[$key] = $row ['id'];
    $age[$key] = $row ['age'];
  }
  array_multisort($id, SORT_ASC, $age, SORT_DESC, $arr);
  print_r($arr);
  //result:Array([0]=>Array(['id']=>3 ['age']=>78) [1]=>Array(['id']=>3 ['age']=>27) [2]=>Array(['id']=>4 ['age']=>44) [3]=>Array(['id']=>5 ['age']=>50))

重构上述代码,只要采用php中的func_get_args函数,来动态获取传入的值,既可以解决多字段个数不确定的问题。实现如下:

$array1 = array(
        0=>array('id'=>8,'name'=>'Apple','age'=> 18),
        1=>array('id'=>8,'name'=>'Bed','age'=>17),
        2=>array('id'=>5,'name'=>'Cos','age'=>16),
        3=>array('id'=>5,'name'=>'Cos','age'=>14)
  );
  function sortArrByManyField(){
    $args = func_get_args();
    if(empty($args)){
      return null;
    }
    $arr = array_shift($args);
    if(!is_array($arr)){
      throw new Exception("第一个参数不为数组");
    }
    foreach($args as $key => $field){
      if(is_string($field)){
        $temp = array();
        foreach($arr as $index=> $val){
          $temp[$index] = $val[$field];
        }
        $args[$key] = $temp;
      }
    }
    $args[] = &$arr;//引用值
    call_user_func_array('array_multisort',$args);
    return array_pop($args);
  }
  $arr = sortArrByManyField($array1,'id',SORT_ASC,'name',SORT_ASC,'age',SORT_DESC);
  print_r($arr);

运行结果如下:

    array(4) {
      [0]=>array(3) {
            ["id"]=>int(5)
            ["name"]=>string(3) "Cos"
            ["age"]=>int(16)
          }
      [1]=>array(3) {
            ["id"]=>int(5)
            ["name"]=>string(3) "Cos"
            ["age"]=>int(14)
          }
      [2]=>array(3) {
            ["id"]=>int(8)
            ["name"]=>string(5) "Apple"
            ["age"]=>int(18)
          }
      [3]=>array(3) {
            ["id"]=>int(8)
            ["name"]=>string(3) "Bed"
            ["age"]=>int(17)
      }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP setcookie() cannot modify header information 的解决方法
Jan 09 PHP
php 上传文件类型判断函数(避免上传漏洞 )
Jun 08 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
php实现简单文件下载的方法
Jan 30 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
PHP实现的分页类定义与用法示例
Jul 05 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
PHP receiveMail实现收邮件功能
Apr 25 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
php strftime函数获取日期时间(switch用法)
May 16 #PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 #PHP
Laravel 集成 Geetest验证码的方法
May 14 #PHP
PHP 多任务秒级定时器的实现方法
May 13 #PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 #PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 #PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 #PHP
You might like
PHP字符串处理的10个简单方法
2010/06/30 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
Javascript Global对象
2009/08/13 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
三种取消选中单选框radio的方法
2014/09/09 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
原生JS实现天气预报
2020/06/16 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
python中import学习备忘笔记
2017/01/24 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
static关键字的用法
2013/10/07 面试题
英语专业个人求职信范文
2014/02/01 职场文书
老乡聚会通知
2015/04/23 职场文书
七一晚会主持词
2015/06/29 职场文书