纯属个人向他人学习,请勿喷。
转载自:https://blog.csdn.net/zls986992484/article/details/69169991
问题引入: 例如现在要对下面的二维数组按照姓名(name)的字典顺序升序排列:
- $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),
- );
方法1:我们可以使用usort()函数,即用户自定义比较函数来对数组中的值进行排序
- /**
- * 按照字典顺序对姓名进行排序,返回值为负数或者false时表示第一个参数应该在前
- * @param [mixed] $x
- * @param [mixed] $y
- * @return [type] [description]
- */
- function sort_by_name($x,$y){
- return strcasecmp($x['name'],$y['name']);
- }
- //usort($person,'sort_by_name'); //设置usort的第二个参数为上面排序的函数名
- //或者直接使用下面匿名函数,即设置usort的第二个参数为一个匿名函数
- usort($person, function($x, $y) {
- return strcasecmp($x['name'],$y['name']);
- });
- var_dump($person);
打印如果如下:
- <span style="font-family:'Microsoft YaHei';font-size:18px;">array (size=4)
- 0 =>
- array (size=4)
- 'num' => string '001' (length=3)
- 'id' => int 7
- 'name' => string 'ahangsan' (length=8)
- 'age' => int 23
- 1 =>
- array (size=4)
- 'num' => string '003' (length=3)
- 'id' => int 1
- 'name' => string 'bhangsan' (length=8)
- 'age' => int 23
- 2 =>
- array (size=4)
- 'num' => string '001' (length=3)
- 'id' => int 3
- 'name' => string 'dhangsan' (length=8)
- 'age' => int 23
- 3 =>
- array (size=4)
- 'num' => string '001' (length=3)
- 'id' => int 6
- 'name' => string 'zhangsan' (length=8)
- 'age' => int 21</span>
方法2:使用array_multisort()排序
假设二维数组结构如下:
- <span style="font-family:'Microsoft YaHei';font-size:18px;">$users = array(
- array('name' => 'tom', 'age' => 20),
- array('name' => 'anny', 'age' => 18),
- array('name' => 'jack', 'age' => 22)
- );</span>
现在要按照age升序排列,则需要先将age提取出来存储到一维数组里,再用array_multisort()进行排序
- <span style="font-family:'Microsoft YaHei';font-size:18px;">//将age提取出来存储到一维数组里
- $ages = array();
- foreach ($users as $user) {
- $ages[] = $user['age'];
- }
- //按照age升序排列
- array_multisort($ages, SORT_ASC, $users);
- var_dump($users);</span>
打印结果如下:
- <span style="font-family:'Microsoft YaHei';font-size:18px;">array (size=3)
- 0 =>
- array (size=2)
- 'name' => string 'anny' (length=4)
- 'age' => int 18
- 1 =>
- array (size=2)
- 'name' => string 'tom' (length=3)
- 'age' => int 20
- 2 =>
- array (size=2)
- 'name' => string 'jack' (length=4)
- 'age' => int 22</span>
如果要先按age升序排列,再按照name升序排列,则多提取一个name数组出来:
- <span style="font-family:tahoma, arial, '宋体';">//将age提取出来存储到一维数组里
- $ages = array();
- foreach ($users as $user) {
- $ages[] = $user['age'];
- }
- //将name提取出来存储到一维数组里
- $names = array();
- foreach ($users as $names) {
- $names[] = $user['name'];
- }
- //先按年龄升序排列,再按照名称升序排列
- array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);
- var_dump($users);</span>
打印结果如下:
- <span style="font-family:'Microsoft YaHei';font-size:18px;">array (size=3)
- 0 =>
- array (size=2)
- 'name' => string 'anny' (length=4)
- 'age' => int 18
- 1 =>
- array (size=2)
- 'name' => string 'tom' (length=3)
- 'age' => int 20
- 2 =>
- array (size=2)
- 'name' => string 'jack' (length=4)
- 'age' => int 22</span>
附完整代码 :
方法1:
- <?php
- /*二维数组排序*/
- //1.使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
- $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时表示第一个参数应该在前
- * @param [mixed] $x
- * @param [mixed] $y
- * @return [type] [description]
- */
- function sort_by_name($x,$y){
- return strcasecmp($x['name'],$y['name']);
- }
- //uasort($person,'sort_by_name'); //用usort也行
- //用匿名函数
- usort($person, function($x, $y) {
- return strcasecmp($x['name'],$y['name']);
- });
- var_dump($person);
- /*
- array (size=4)
- 0 =>
- array (size=4)
- 'num' => string '001' (length=3)
- 'id' => int 7
- 'name' => string 'ahangsan' (length=8)
- 'age' => int 23
- 1 =>
- array (size=4)
- 'num' => string '003' (length=3)
- 'id' => int 1
- 'name' => string 'bhangsan' (length=8)
- 'age' => int 23
- 2 =>
- array (size=4)
- 'num' => string '001' (length=3)
- 'id' => int 3
- 'name' => string 'dhangsan' (length=8)
- 'age' => int 23
- 3 =>
- array (size=4)
- 'num' => string '001' (length=3)
- 'id' => int 6
- 'name' => string 'zhangsan' (length=8)
- 'age' => int 21
- */
方法2:
- <?php
- /*二维数组排序*/
- // 2.使用array_multisort排序
- $users = array(
- array('name' => 'tom', 'age' => 20),
- array('name' => 'anny', 'age' => 18),
- array('name' => 'jack', 'age' => 22)
- );
- //将age提取出来存储到一维数组里
- $ages = array();
- foreach ($users as $user) {
- $ages[] = $user['age'];
- }
- //将name提取出来存储到一维数组里
- $names = array();
- foreach ($users as $names) {
- $names[] = $user['name'];
- }
- //按照age升序排列
- array_multisort($ages, SORT_ASC, $users);
- var_dump($users);
- /*
- array (size=3)
- 0 =>
- array (size=2)
- 'name' => string 'anny' (length=4)
- 'age' => int 18
- 1 =>
- array (size=2)
- 'name' => string 'tom' (length=3)
- 'age' => int 20
- 2 =>
- array (size=2)
- 'name' => string 'jack' (length=4)
- 'age' => int 22
- */
- //先按年龄升序排列,再按照名称升序排列
- array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);
- var_dump($users);
- /*
- array (size=3)
- 0 =>
- array (size=2)
- 'name' => string 'anny' (length=4)
- 'age' => int 18
- 1 =>
- array (size=2)
- 'name' => string 'tom' (length=3)
- 'age' => int 20
- 2 =>
- array (size=2)
- 'name' => string 'jack' (length=4)
- 'age' => int 22
- */
这里顺便说一下PHP排序的几个函数
sort 对数组排序 一般适用于一维索引数组,不会保持索引
rsort 对数组逆向排序 和sort用法一致
asort 对数组进行排序并保持索引关系对值进行排序,一般适用于一维数组,保持索引关系
arsort 对数组进行逆向排序并保持索引关系和asort用法一致
ksort 对数组按照键名排序
krsort 对数组按照键名逆向排序
my github:https://github.com/lensh