php中二维数组排序问题方法详解
PHP中二维数组排序,可以使用PHP内置函数uasort()
示例一:
使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
回调函数如下:注意回调函数的返回值是负数或者是false的时候,表示回调函数的第一个参数在前,第二个参数在后排列
1
2
3
4
5
6
7
8
9
10
|
$person = array ( array ( 'num' => '001' , 'id' =>6, 'name' => 'zhangsan' , 'age' =>21), array ( 'num' => '001' , 'id' =>7, 'name' => 'ahangsan' , 'age' =>23), array ( 'num' => '003' , 'id' =>1, 'name' => 'bhangsan' , 'age' =>23), array ( 'num' => '001' , 'id' =>3, 'name' => 'dhangsan' , 'age' =>23), ); //负数或者false表示第一个参数应该在前 function sort_by_name( $x , $y ){ return strcasecmp ( $x [ 'name' ], $y [ 'name' ]); } |
使用如下:
1
|
uasort( $person , 'sort_by_name' ); |
下面给出一个二维数组排序的方法,供参考和面试使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//$array 要排序的数组 //$row 排序依据列 //$type 排序类型[asc or desc] //return 排好序的数组 function array_sort( $array , $row , $type ){ $array_temp = array (); foreach ( $array as $v ){ $array_temp [ $v [ $row ]] = $v ; } if ( $type == 'asc' ){ ksort( $array_temp ); } elseif ( $type = 'desc' ){ krsort( $array_temp ); } else { } return $array_temp ; } |
示例二:
一维数组排序可以使用asort、ksort等一些方法进程排序,相对来说比较简单。二维数组的排序怎么实现呢?使用array_multisort和usort可以实现
例如像下面的数组:
代码如下:
1
2
3
4
5
|
$users = array ( array ( 'name' => 'tom' , 'age' => 20) , array ( 'name' => 'anny' , 'age' => 18) , array ( 'name' => 'jack' , 'age' => 22) ); |
希望能按照age从小到大进行排序。笔者整理了两个方法出来,分享给大家。
1、使用array_multisort
使用这个方法,会比较麻烦些,要将age提取出来存储到一维数组里,然后按照age升序排列。具体代码如下:
代码如下:
1
2
3
4
5
|
$ages = array (); foreach ( $users as $user ) { $ages [] = $user [ 'age' ]; } array_multisort ( $ages , SORT_ASC, $users ); |
执行后,$users就是排序好的数组了,可以打印出来看看。如果需要先按年龄升序排列,再按照名称升序排列,方法同上,就是多提取一个名称数组出来,最后的排序方法这样调用:
代码如下:
1
|
array_multisort ( $ages , SORT_ASC, $names , SORT_ASC, $users ); |
2、使用usort
使用这个方法最大的好处就是可以自定义一些比较复杂的排序方法。例如按照名称的长度降序排列:
代码如下:
1
2
3
4
5
6
7
|
usort( $users , function ( $a , $b ) { $al = strlen ( $a [ 'name' ]); $bl = strlen ( $b [ 'name' ]); if ( $al == $bl ) return 0; return ( $al > $bl ) ? -1 : 1; }); |
这里使用了匿名函数,如果有需要也可以单独提取出来。其中$a, $b可以理解为$users数组下的元素,可以直接索引name值,并计算长度,而后比较长度就可以了。
=====================================================================
这里顺便说一下PHP排序的几个函数
sort 对数组排序一般适用于一维索引数组,不会保持索引
rsort 对数组逆向排序 和sort用法一致
asort 对数组进行排序并保持索引关系对值进行排序,一般适用于一维数组,保持索引关系
arsort 对数组进行逆向排序并保持索引关系和asort用法一致
ksort 对数组按照键名排序
krsort 对数组按照键名逆向排序
php中二维数组排序问题方法详解的更多相关文章
- JavaScript中数组Array方法详解
ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...
- JS数组reduce()方法详解及高级技巧
1.语法 arr.reduce(callback,[initialValue]) reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上 ...
- JS进阶篇--JS数组reduce()方法详解及高级技巧
基本概念 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被 ...
- ES6中的数组reduce()方法详解
reduce() 方法对数组中的每个元素执行一个由我们提供的reducer函数(升序执行),将其结果汇总为单个返回值. 1. 语法reduce说明 arr.reduce(callback(accumu ...
- Arrays 类的 binarySearch() 数组查询方法详解
Arrays类的binarySearch()方法,可以使用二分搜索法来搜索指定的数组,以获得指定对象.该方法返回要搜索元素的索引值.binarySearch()方法提供多种重载形式,用于满足各种类型数 ...
- PHP基于phpqrcode类生成二维码的方法详解
前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是 ...
- js数组sort方法详解
在处理数组的时候,我们有时候需要对数组进行排序,排序的方法有很多种,但是最好最快的就是利用sort方法进行快速的排序. 我们来看一个例子: var arr1 = [6, 3, 4, 1, 2, 5, ...
- JS reduce()方法详解,使用reduce数组去重
壹 ❀ 引 稍微有了解JavaScript数组API的同学,对于reduce方法至少有过一面之缘,也许是for与forEach太强大,或者filter,find很实用,在实际开发中我至始至终没使用过 ...
- JavaScript数组方法详解
JavaScript数组方法详解 JavaScript中数组的方法种类众多,在ES3-ES7不同版本时期都有新方法:并且数组的方法还有原型方法和从object继承的方法,这里我们只介绍数组在每个版本中 ...
随机推荐
- plsql导入excel文件
plsql导入excel文件 CREATE TABLE DWSB_GRMX1 ( XH VARCHAR2(40), SFZH VARCHAR2(40 ...
- sql server中如何将两个字段数据合并成一个字段显示(字段与字段添加特殊符号)
之前,我在做统计数据时,需要一个字段显示某月的订单数量和订单金额,要求组合成一个字段,用括号组合. 统计出来的结果大概是这样的,首先我们来创建一些模拟数据 ---创建订单表--- create tab ...
- PHP:第一章——php中数据类型和强制类型转换
<?php //PHP中的数据类型: //标量类型:布尔型(boolean).整型(integer).浮点型(float).字符串型(string) //复合类型:数组(array).对象(ob ...
- C++模板详解——使用篇
假如我们需要取得两个变量中较大的变量,或许,我们可以通过重载的方式实现,如下. int max(int fir,int sec); float max(float fir,float sec); do ...
- oracle_sql语句的大全
# 建立数据库struts CREATE DATABASE IF NOT EXISTS struts DEFAULT CHARACTER SET GBK; 1.登录:(管理员)conn sys/p ...
- 下拉选择框 Spinner的用法。
代码如下: package com.lixu.xialakuang; import android.app.Activity; import android.content.Context; impo ...
- 前端必学库之bootstrap
想要成为一个全栈程序员,其实有很多技术线路.很多人说有了nodejs后,只学JAVASCRIPT就可以了.其实,会NODEJS后端开发,严格来说算是高级前端.就站长个人理解,后端的主流还是4P:jsp ...
- Nexus私服的安装与配置
Nexus的安装与配置 仅以此文,献给陷入懒癌晚期的小伙伴们. 本文基于nexus 3.xx .0. What?Why?When?Who?Where? Sonatype Nexus是一款maven仓库 ...
- C# 历史曲线控件 基于时间的曲线控件 可交互的高级曲线控件 HslControls曲线控件使用教程
本篇博客主要对 HslControls 中的曲线控件做一个详细的教程说明,大家可以根据下面的教程开发出高质量的曲线控件 Prepare 先从nuget下载到组件,然后就可以使用组件里的各种组件信息了. ...
- ZooKeeper 集群环境搭建 (本机3个节点)
--------------------------------------------------------1.建立目录server1server1/dataDirserver1/dataLogD ...