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伪造referer突破网盘禁止外连的代码
Jun 15 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
Php header()函数语法及使用代码
Nov 04 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
May 07 PHP
使用PHP和HTML5 FormData实现无刷新文件上传教程
Sep 06 PHP
PHP读取大文件末尾N行的高效方法推荐
Jun 03 PHP
Thinkphp微信公众号支付接口
Aug 04 PHP
Linux系统中为php添加pcntl扩展
Aug 28 PHP
Laravle eloquent 多对多模型关联实例详解
Nov 22 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
php模式设计之观察者模式应用实例分析
Sep 25 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小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
python简单获取数组元素个数的方法
2015/07/13 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
优秀大学生自荐信
2015/03/26 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
python 实现的截屏工具
2021/05/08 Python
Python实现机器学习算法的分类
2021/06/03 Python
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript