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时间戳与日期之间转换的实例介绍
Apr 19 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
php接口与接口引用的深入解析
Aug 09 PHP
Linux下PHP安装mcrypt扩展模块笔记
Sep 10 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
PHP记录页面停留时间的方法
Mar 30 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
php微信公众号开发之快递查询
Oct 20 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
python类装饰器用法实例
2015/06/04 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
物流专业大学应届生求职信
2013/11/03 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
质量负责人任命书
2014/06/06 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
ant design vue的form表单取值方法
2022/06/01 Vue.js