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 相关文章推荐
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 PHP
简单分析ucenter 会员同步登录通信原理
Aug 25 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
PHP嵌套输出缓冲代码实例
May 12 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
PHP批量获取网页中所有固定种子链接的方法
Nov 18 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
PHP大文件及断点续传下载实现代码
Aug 18 PHP
PHP实现简单日历类编写
Aug 28 PHP
PHP超全局变量实现原理及代码解析
Sep 01 PHP
php中yii框架实例用法
Dec 22 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返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
往光标所在位置插入值的js代码
2013/09/22 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
Python验证码识别处理实例
2015/12/28 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python如何使用input函数获取输入
2020/08/06 Python
python 制作本地应用搜索工具
2021/02/27 Python
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
中餐厅主管的职责范文
2014/02/04 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
2014年销售员工作总结
2014/12/01 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书