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 相关文章推荐
怎么样可以把 phpinfo()屏蔽掉?
Nov 24 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
Oct 29 PHP
PHP生成二维码的两个方法和实例
Jul 01 PHP
PHP远程采集图片详细教程
Jul 01 PHP
PHP反向代理类代码
Aug 15 PHP
php字符串截取函数用法分析
Nov 25 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
Laravel5中contracts详解
Mar 02 PHP
PHP中返回引用类型的方法
Apr 03 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 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中for与foreach的区别分析
2011/03/09 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
vue服务端渲染缓存应用详解
2018/09/12 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
Python使用爬虫猜密码
2016/02/19 Python
详解Python3 基本数据类型
2019/04/19 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
社会实践自我鉴定
2013/11/07 职场文书
企事业单位求职者的自我评价
2013/12/28 职场文书
自我鉴定写作要点
2014/01/17 职场文书
学历公证委托书
2014/04/09 职场文书
借款协议书
2014/04/12 职场文书
工作评语大全
2014/04/26 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书