php 二维sort,php 二维数组排序

前提

给定一个二维数组,请根据指定的数组key,写出最优的排序。排序条件age asc,sex desc,指定数组如下:

$arr = [

['id'=>1, 'age'=>1, 'sex'=>6, 'name'=>'a'],

['id'=>2, 'age'=>3, 'sex'=>1, 'name'=>'c'],

['id'=>3, 'age'=>3, 'sex'=>1, 'name'=>'b'],

['id'=>4, 'age'=>2, 'sex'=>1, 'name'=>'d'],

];

估计大家都没有什么问题,排序嘛,简单的不要不要的:

方式一:

array_multisort(array_column($arr,'age'),SORT_ASC,array_column($arr,'sex'), SORT_DESC, $mylist);

这应该是最简单的方式了,直接使用php现成的函数,快捷的不要不要的。

方式二:

$sort = [];

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

$sort['age'][$k] = $v['age'];

$sort['sex'][$k] = $v['sex'];

}

array_multisort($sort['age'],SORT_ASC,$sort['sex'],SORT_DESC,$mylist);

嗯,勉强看的过去,但是感觉有点不优雅。

方式三:

$orders=['age'=>'asc','sex'=>'desc'];

usort($arr, function($a, $b) use($orders) {

$result = [];

foreach ($orders as $key=>$value) {

list($field, $sort) = [$key,$value];

if (!(isset($a[$field]) && isset($b[$field]))) {

continue;

}

if (strcasecmp($sort, 'desc') === 0) {

$tmp = $a;

$a = $b;

$b = $tmp;

}

if (is_numeric($a[$field]) && is_numeric($b[$field]) ) {

$result[] = $a[$field] - $b[$field];

} else {

$result[] = strcmp($a[$field], $b[$field]);

}

}

return implode('', $result);

});

三种方式都可以,都比较简单,那么问题来了。

问题

如果排序数组不是固定的呢,排序数组是动态从数据库查询出来,排序条件也不是固定的呢,那么我们肯定要封装函数,如果使用php内置函数:

function _sort(){

......

array_multisort(...)

}

这里我们就看出问题来了,array_multisort的参数不固定啊,使用有两个方法:func_get_args()和...$arg,放弃func_get_args(),因为没有办法使用。如果是自己写的函数也建议不用,因为使用func_get_args(),容易让函数看上去是不需要传递参数的。如果你在写大量代码的时候,进行缩放的时候,也很难了解这个函数参数大概细节。这是非常不方便的。所以函数如下:

function _sort( &$arr, $sorts )

{

$sortParams = [];

foreach ( $sorts as $key => $v ) {

$sortParams[] = array_column($arr, $key);

$sortParams[] = strcasecmp($v, 'desc') === 0 ? SORT_DESC : SORT_ASC;

}

array_push($sortParams, $arr);

array_multisort(...$sortParams);

}

_sort(['age'=>'asc','name'=>'desc','sex'=>'asc']);

看是去很好对吧,但是运行才知道,没有效果,难道是array_multisort不支持...$arg,查看了手册,没看到说明,?,那就放弃自带的函数,想自己写好了:

function arrayOrderBy(array &$arr, $order = null) {

if (is_null($order)) {

return $arr;

}

$orders = explode(',', $order);

usort($arr, function($a, $b) use($orders) {

$result = array();

foreach ($orders as $value) {

list($field, $sort) = array_map('trim', explode(' ', trim($value)));

if (!(isset($a[$field]) && isset($b[$field]))) {

continue;

}

if (strcasecmp($sort, 'desc') === 0) {

$tmp = $a;

$a = $b;

$b = $tmp;

}

if (is_numeric($a[$field]) && is_numeric($b[$field]) ) {

$result[] = $a[$field] - $b[$field];

} else {

$result[] = strcmp($a[$field], $b[$field]);

}

}

arrayOrderBy($arr, 'age asc,sex asc,name desc');

其实这就是一道面试题,大概意思让用PHP写一个类似mysql的order by的功能,其实也很简单。

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国人数学好,数学思维差?

小天经常可以看到在微博热搜吐槽歪果仁数学不好的段子,比如6.8,我们习惯给11.8,让收银员找5块钱,但歪果仁就不行啦,这样他们会更乱!所以我们容易觉得中国人数学好,算数特别快还准!但…

Linux/Unix环境下的make命令详解

无论是在linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包…

[导入]心平气和,千佳骈集;意粗性躁,一事无成

以前自己常给别人说的一句话今天有人不经意间说给我听,颇觉其理——反正怎么过都是一天,还不如不要想那么多开心地过一天。经历挫折后,愈发觉到心胸开阔的重要。还是要作好总结与积累,由于工作忙已经一周没上CSDN回答问题了&#…

生产力提升! 自己动手自定义Visual Studio 2019的 类创建模板,制作简易版Vsix安装包...

序言最近一直在开发 webApi 接口,为了方便我采用了反Restful风格开发,90%的接口均采用post方式,小部分查询采用Get方式,接口的入参和出参定义每次都需要手动创建2个类,心不累手累,怎么能减轻点工作&#xf…

bo JAVA是什么意思,大家来讨论下业务层(BO)该做什么事?该怎样做事?该怎么解决...

Java code//实体类public class User {String name;String password;public User(){}public User(String name, String password) {super();this.name name;this.password password;}public String getName() {return name;}public void setName(String name) {this.name na…

【个人笔记】关于IO类中流的整理

学习IO部分的知识后,被处理流的各种类搞得有点乱,所以得写篇文章总结下。IO包里面有很多输入输出类,一般我们是通过控制流来控制输入输出的。IO包里面对于控制流分为两大类,一类是字节流,一类是字符流。字符流的两个大…

全国胸最小的省是哪个,你知道吗?| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源网络,侵权删)所以最大的是哪个省的↓ ↓ ↓

经典正则表达式(转)

正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。我将一些常用的表达式收藏在这里,作备忘之用。本贴随时会更新。 匹配中文字符的正则表达式: [\u4e00-\u9…

.NET Core with 微服务 - Elastic APM

上一次我们介绍了Seq日志聚合组件。这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件。APM 监控围绕对应用、服务、容器的健康监控,对接口的调用链、性能进行监控。在我们实施微服务后,由于复杂的业务逻辑,服务之间的调…

java 推送数据给js,Node.js实现数据推送

场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器)。后端推送数据的解决方案有很多,比如轮询、Comet、WebSocket。1. 轮询对于后端来说开发成本最低,就是按照传统的方式处理Ajax请求并返回数据,在学校的时候实验室的项目一…

【开学季限时免费】下载19880元大数据开发全链路教程(视频+源码)

随着大数据、云计算、物联网、人工智能这些行业的发展崛起,对于大数据人才的需求越来越大,而大数据人才的培养发展周期相对较长,导致了大数据人才短缺,市场供不应求。所以也就出现了大数据开发工程师、数仓工程师、ETL工程师.....…

COM 组件设计与应用(七)

COM 组件设计与应用(七)编译、注册、调用作者:杨老师 一、前言  上两回中,咱们用 ATL 写了第一个 COM 组件程序,这回中,主要介绍编译、注册和调用方法。示例程序你已经下载了吗?如果还没有下载…

root目录空间不够的问题

今天导入mysql表的时候,提示write file error /tmp/xxx 原因是表太大,创建临时表的时候,tmp目录不够空间了。 找到一个解决方法: 使用 mount --bind mount --bind /home/tmp /tmp 这样会把 /home/tmp目录mount成tmp,原…

NET问答: 为什么 IEnumerablestring 不能被初始化?

咨询区 markzzz&#xff1a;我有下面的一个对象。IEnumerable<string> m_oEnum null;现在我想初始化它&#xff0c;然后我做了下面的尝试。IEnumerable<string> m_oEnum new IEnumerable<string>() { "1", "2", "3"};很遗憾…

java spring 单例模式,spring中的单例模式

spring依赖注入的bean默认都是单例模式&#xff0c;他们是怎么创建的&#xff1f;在AbstractBeanFactory类中的getBean方法中调用了getSingleton()方法来创建bean&#xff1a;Nullableprotected Object getSingleton(String beanName, boolean allowEarlyReference) {Object si…

人类史上20个“最强大脑”

全世界只有3.14 %的人关注了青少年数学之旅今天给大家说道说道这人类历史上20位最强大脑&#xff0c;这些伟人来自各个不同的时期和领域&#xff0c;他们的思想和贡献对人类日后有着重大的影响&#xff0c;其中包括了众多的科学家&#xff0c;哲学家&#xff0c;诗人&#xff0…

LYNC2013部署系列PART4:群聊部署

前言&#xff1a;本篇文章将介绍LYNC2013群聊服务器的部署&#xff0c;在LYNC2010中&#xff0c;群聊服务还没集成到LYNC2010产品中&#xff0c;需要单独额外部署&#xff0c;群聊客户端也没有集成到LYNC2010客户端中。到LYNC2013中&#xff0c;集成工作全部搞定了。我是习惯了…

很久没有更新博客了

最近一直很忙&#xff0c;唉&#xff0c;一直没来&#xff0c;今天抽来来看一下~~ 转载于:https://www.cnblogs.com/Jerryes/archive/2005/10/28/264150.html

不要笑!写 | 还是 || ,还真是一个问题

这么简单的问题还写&#xff1f;先不要笑。打开你代码量最多的项目&#xff0c;搜索|或者&,看看有多少条这样的代码&#xff01;前不久&#xff0c;我在dotnet/machinelearning上提交了一个pull request。修改内容是把"|"改成"||", 把"&"…

java如何解压rar文件怎么打开,java解压rar文件

该文章参考了iteye某位大虾的博客&#xff0c;我自己进行了修改。请大家参考package cn;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import de.innosystec.unrar.Archive;import de.innosystec.un…