排序是数据统计非常重要的环节,简单几行代码轻松搞定二维数组的排序

$data[] = array('volume' => 67, 'edition' => 2);

$data[] = array('volume' => 86, 'edition' => 1);

$data[] = array('volume' => 85, 'edition' => 6);

$data[] = array('volume' => 98, 'edition' => 2);

$data[] = array('volume' => 86, 'edition' => 6);

$data[] = array('volume' => 67, 'edition' => 7);

// 取得列的列表

foreach ($data as $key => $row) {

$volume[] = $row['volume'];

$edition[] = $row['edition'];

}

// 将数据根据 volume 降序排列,根据 edition 升序排列

// 把 $data 作为最后一个参数,以通用键排序

array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

print_r($data);

//输出output

array

(

[0] => Array

(

[volume] => 98

[edition] => 2

)

[1] => Array

(

[volume] => 86

[edition] => 1

)

[2] => Array

(

[volume] => 86

[edition] => 6

)

[3] => Array

(

[volume] => 85

[edition] => 6

)

[4] => Array

(

[volume] => 67

[edition] => 2

)

[5] => Array

(

[volume] => 67

[edition] => 7

)

)

我们可以看到php官方已经为二维排序内置了排序方法array_multisort,但是很难用。所以自己动手拼装一个吧

第二步 封装方法

/**

* @param array $arr

* @param array $keys

* @param array $order

* @return bool|mixed

*/

function sort_array_multi(array &$arr, array $keys, array $order)

{

//校验参数

if ( count($keys) == ($times = count($order)) ) {

for ( $i = 0, $j = 0; $j < $times; $i += 2, $j++ ) {

foreach ( $arr as $k => $v ) {

//原数组是否存在该字段

if ( isset($v[$keys[$j]]) ) {

$params[$i][] = $v[$keys[$j]]; //TODO 中文排序支持

} else {

return false;

}

}

if ( strtoupper($order[$j]) == 'ASC' ) {

$params[$i + 1] = SORT_ASC;

} else {

$params[$i + 1] = SORT_DESC;

}

}

$params[] = &$arr;

return call_user_func_array('array_multisort', $params);

} else {

return false;

}

}

$data = [

['name' => 1, 'score' => 2.2],

['name' => 2, 'score' => 3.3],

['name' => 4, 'score' => 2.5],

['name' => 1, 'score' => 1.1],

['name' => 0, 'score' => 4],

];

//调用方法

sort_array_multi($data, ['name', 'score'], ['asc', 'desc']);

通过call_user_func_array方法将array_multisort的不定参数参数以数组的方式注入到方法中,省去了每次都要手动的拼接参数,最后排序成功返回true,失败返回false

$n = count($order);

$params数组说明:

$params[0]是需要排列的数组keys的第0项在原数组二维$data中的全部的name字段的值,等价于array_column($data, 'name');

$params[1]是需要排列的数组keys的第0项对应排序规则$order中的升降序;

$params[3]是需要排列的数组keys的第1项在原数组二维$data中的全部的score字段的值 等价于array_column($data, 'score');

$params[4]是需要排列的数组keys的第1项对应排序规则$order中的升降序;

......

$params[2*$n+1]是需要排列的原数组$data的引用;

第三步 中文排序的支持

//刚才的代码中对中文utf-8排序的支持显然是不够好的,这里稍微改造一下将uft-8转为gbk编码就能很好的支持中文排序了

$params[$i][] = iconv('UTF-8', 'GBK', $v[$keys[$j]]);

第四步 测试

//input

$data = [

['name' => '新疆', 'score' => 2.2 , 'id' => 1 ],

['name' => '阿a', 'score' => 2.1 , 'id' => 1 ],

['name' => '阿b', 'score' => 3.3 , 'id' => 2 ],

['name' => '湖南1', 'score' => 2.5 , 'id' => 3 ],

['name' => '湖南10', 'score' => 1.1 , 'id' => 4 ],

['name' => '北京', 'score' => 4 , 'id' => 5 ],

['name' => '广州', 'score' => 4 , 'id' => 6 ],

['name' => '阿a', 'score' => 2.2 , 'id' => 1 ],

];

sort_array_multi($data, ['name', 'id','score'], ['asc', 'asc','desc']);

//output

Array

(

[0] => Array

(

[name] => 阿a

[score] => 2.2

[id] => 1

)

[1] => Array

(

[name] => 阿a

[score] => 2.1

[id] => 1

)

[2] => Array

(

[name] => 阿b

[score] => 3.3

[id] => 2

)

[3] => Array

(

[name] => 北京

[score] => 4

[id] => 5

)

[4] => Array

(

[name] => 广州

[score] => 4

[id] => 6

)

[5] => Array

(

[name] => 湖南1

[score] => 2.5

[id] => 3

)

[6] => Array

(

[name] => 湖南10

[score] => 1.1

[id] => 4

)

[7] => Array

(

[name] => 新疆

[score] => 2.2

[id] => 1

)

)

大功告成,此处应该有掌声!!!!

看完教程觉得有收获请关注博主简书,点赞此文章

欢迎加博主微信(18501258725)多讨论交流敏捷开发工具和码农心得。

php二维数组倒序,几行代码搞定PHP二维数组排序相关推荐

  1. 短短60行代码搞定鸿蒙“二维码扫描”功能!

    开发者(KaiFaX) 面向全栈工程师的开发者专注于前端.Java/Python/Go/PHP的技术社区 可以实现的效果就是打开摄像头扫描一张二维码图片然后显示二维码里面的内容,看个视频一睹为快吧(界 ...

  2. 国外stripe支付,超简单几行代码搞定

    国外stripe支付,超简单几行代码搞定 海外的项目 需要stripe支付 很简单 几行代码 先加入依赖: compile 'com.stripe:stripe-android:6.1.2' 总共两种 ...

  3. 万万想不到 10行代码搞定一个决策树

    01决策树模拟实验 文章目录 01决策树模拟实验 要求 决策树简单介绍 搭建环境 产生数据集 划分训练集和测试集 生成决策树 Cross-Validation法 可视化决策树 10行代码搞定决策树 要 ...

  4. resnet50代码_13、SOTA论文实践-学习ResNet(80行代码搞定残差backbone网络)

    0.论文 Camera Distance-aware Top-down Approach for 3D Multi-person Pose Estimation from a Single RGB I ...

  5. python做事件研究法_35行代码搞定事件研究法(上)

    作者简介: 祝小宇,个人公众号:大猫的R语言课堂 这期大猫课堂将会教大家如何用35行R代码写出最有效率的事件研究法. 注意,本代码主要使用data.table完成,关于data.table包的相应知识 ...

  6. 35行代码搞定事件研究法(下)

    作者简介: 祝小宇,个人公众号:大猫的R语言课堂 前文推送: 35行代码搞定事件研究法(上) Hello亲爱的小伙伴们,上期已经讲到如何对单一事件日计算超额收益,本期将会教大家如何针对多个股票多个事件 ...

  7. java微信支付代码_10行代码搞定微信支付(Java版)

    原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...

  8. 35行代码搞定事件研究法(上)

    作者简介: 祝小宇,个人公众号:大猫的R语言课堂 这期大猫课堂将会教大家如何用35行R代码写出最有效率的事件研究法. 注意,本代码主要使用data.table完成,关于data.table包的相应知识 ...

  9. python数学公式编辑工具_1行代码搞定Latex公式编写,这个4.6M的Python小插件,堪称论文必备神器...

    原标题:1行代码搞定Latex公式编写,这个4.6M的Python小插件,堪称论文必备神器 来源:量子位 关注前沿科技 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 萧箫 发自 凹非寺 ...

最新文章

  1. 分子生物学之蛋白质概述
  2. memcpy、memmove、memset、memchr、memcmp、strstr详解
  3. (五)ElasticSearch 6.1.1数据类型
  4. iotop监视磁盘I/O
  5. 深入理解Nginx模块开发与架构解析第2版(书签导航正确)
  6. VS2015 无法启动IIS Express Web服务器
  7. 桂林理工大学 就业指导 2021 创业项目计划书样本
  8. MinGW编译windows可以调试的ffmpeg4.4
  9. 计算机语言工资排行,Python位居编程语言薪资排行榜前列!风变编程打造职场竞争力...
  10. 《山月记》一定有那么一刻,我们曾迷茫怀疑
  11. 8421拨码开关C语言编程,8052单片机怎样读出8421BCD码拨码开关设定的数值
  12. TTL传输中过期问题导致网站打不开
  13. 怎么实现微信公众号生成专属二维码推广来源统计
  14. STL——SET操作与并交差
  15. 看完这一篇,你也可以自如地掌握字节码插桩
  16. 2022年初级会计考试综合试题及答案
  17. http://dev.firnow.com/course/3_program/java/javashl/200726/11199.html
  18. Socket TCP协议解决粘包、半包问题的三种解决方案
  19. 漫谈 · 软件设计中的具象化
  20. 营销管理手册_营销管理学院新生入学讲座系列第四讲——学习红绿灯之学习学生手册...

热门文章

  1. [转载]Qualcomm Wlan Country Code
  2. tomcat principle
  3. DROP DATABASE
  4. 和摄影相关的英文词汇
  5. 正则表达式元字符含义
  6. Unreal Open Day 2017 参会总结——腾讯逆战游戏项目制作经验分享
  7. 基于C#的ORECLE数据库操作类
  8. 将工作表按条件拆分成多个工作表或者工作簿,包含快速拆分与精致拆分
  9. 使cson结构体中数组长度为空时,转换成Json字符串时输出空数组
  10. IOS下实现高性能画板橡皮擦的办法