二维数组排序--转载

纯属个人向他人学习,请勿喷。

转载自:https://blog.csdn.net/zls986992484/article/details/69169991

问题引入: 例如现在要对下面的二维数组按照姓名(name)的字典顺序升序排列:

[php]  view plain  copy
  1. $person = array(  
  2.   array('num'=>'001','id'=>6,'name'=>'zhangsan','age'=>21),  
  3.   array('num'=>'001','id'=>7,'name'=>'ahangsan','age'=>23),  
  4.   array('num'=>'003','id'=>1,'name'=>'bhangsan','age'=>23),  
  5.   array('num'=>'001','id'=>3,'name'=>'dhangsan','age'=>23),  
  6. );  

 方法1:我们可以使用usort()函数,即用户自定义比较函数来对数组中的值进行排序

[php]  view plain  copy
  1. /** 
  2.  * 按照字典顺序对姓名进行排序,返回值为负数或者false时表示第一个参数应该在前 
  3.  * @param  [mixed] $x 
  4.  * @param  [mixed] $y 
  5.  * @return [type]    [description] 
  6.  */  
  7. function sort_by_name($x,$y){  
  8.   return strcasecmp($x['name'],$y['name']);  
  9. }  
  10.   
  11. //usort($person,'sort_by_name');    //设置usort的第二个参数为上面排序的函数名  
  12.   
  13. //或者直接使用下面匿名函数,即设置usort的第二个参数为一个匿名函数  
  14. usort($personfunction($x$y) {  
  15.      return strcasecmp($x['name'],$y['name']);  
  16. });  
  17.   
  18. var_dump($person);  

打印如果如下:

[php]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:18px;">array (size=4)  
  2.   0 =>   
  3.     array (size=4)  
  4.       'num' => string '001' (length=3)  
  5.       'id' => int 7  
  6.       'name' => string 'ahangsan' (length=8)  
  7.       'age' => int 23  
  8.   1 =>   
  9.     array (size=4)  
  10.       'num' => string '003' (length=3)  
  11.       'id' => int 1  
  12.       'name' => string 'bhangsan' (length=8)  
  13.       'age' => int 23  
  14.   2 =>   
  15.     array (size=4)  
  16.       'num' => string '001' (length=3)  
  17.       'id' => int 3  
  18.       'name' => string 'dhangsan' (length=8)  
  19.       'age' => int 23  
  20.   3 =>   
  21.     array (size=4)  
  22.       'num' => string '001' (length=3)  
  23.       'id' => int 6  
  24.       'name' => string 'zhangsan' (length=8)  
  25.       'age' => int 21</span>  

方法2:使用array_multisort()排序

假设二维数组结构如下:

[php]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:18px;">$users = array(  
  2.   array('name' => 'tom''age' => 20),   
  3.   array('name' => 'anny''age' => 18),  
  4.   array('name' => 'jack''age' => 22)  
  5. );</span>  

现在要按照age升序排列,则需要先将age提取出来存储到一维数组里,再用array_multisort()进行排序

[php]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:18px;">//将age提取出来存储到一维数组里  
  2. $ages = array();  
  3. foreach ($users as $user) {  
  4.   $ages[] = $user['age'];  
  5. }  
  6. //按照age升序排列  
  7. array_multisort($ages, SORT_ASC, $users);   
  8. var_dump($users);</span>  

打印结果如下:

[php]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:18px;">array (size=3)  
  2.   0 =>   
  3.     array (size=2)  
  4.       'name' => string 'anny' (length=4)  
  5.       'age' => int 18  
  6.   1 =>   
  7.     array (size=2)  
  8.       'name' => string 'tom' (length=3)  
  9.       'age' => int 20  
  10.   2 =>   
  11.     array (size=2)  
  12.       'name' => string 'jack' (length=4)  
  13.       'age' => int 22</span>  

如果要先按age升序排列,再按照name升序排列,则多提取一个name数组出来:

[php]  view plain  copy
  1. <span style="font-family:tahoma, arial, '宋体';">//将age提取出来存储到一维数组里  
  2. $ages = array();  
  3. foreach ($users as $user) {  
  4.   $ages[] = $user['age'];  
  5. }  
  6. //将name提取出来存储到一维数组里  
  7. $names = array();  
  8. foreach ($users as $names) {  
  9.   $names[] = $user['name'];  
  10. }  
  11. //先按年龄升序排列,再按照名称升序排列  
  12. array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);  
  13. var_dump($users);</span>  

打印结果如下:

[php]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:18px;">array (size=3)  
  2.   0 =>   
  3.     array (size=2)  
  4.       'name' => string 'anny' (length=4)  
  5.       'age' => int 18  
  6.   1 =>   
  7.     array (size=2)  
  8.       'name' => string 'tom' (length=3)  
  9.       'age' => int 20  
  10.   2 =>   
  11.     array (size=2)  
  12.       'name' => string 'jack' (length=4)  
  13.       'age' => int 22</span>  

附完整代码

方法1:

[php]  view plain  copy
  1. <?php  
  2. /*二维数组排序*/  
  3.   
  4. //1.使用用户自定义的比较函数对数组中的值进行排序并保持索引关联  
  5. $person = array(  
  6.   array('num'=>'001','id'=>6,'name'=>'zhangsan','age'=>21),  
  7.   array('num'=>'001','id'=>7,'name'=>'ahangsan','age'=>23),  
  8.   array('num'=>'003','id'=>1,'name'=>'bhangsan','age'=>23),  
  9.   array('num'=>'001','id'=>3,'name'=>'dhangsan','age'=>23),  
  10. );  
  11.   
  12. /** 
  13.  * 按照字典顺序对姓名进行排序,返回值为负数或者false时表示第一个参数应该在前 
  14.  * @param  [mixed] $x 
  15.  * @param  [mixed] $y 
  16.  * @return [type]    [description] 
  17.  */  
  18. function sort_by_name($x,$y){  
  19.   return strcasecmp($x['name'],$y['name']);  
  20. }  
  21.   
  22. //uasort($person,'sort_by_name');    //用usort也行  
  23.   
  24. //用匿名函数  
  25. usort($personfunction($x$y) {  
  26.      return strcasecmp($x['name'],$y['name']);  
  27. });  
  28.   
  29. var_dump($person);  
  30.   
  31. /* 
  32. array (size=4) 
  33.   0 =>  
  34.     array (size=4) 
  35.       'num' => string '001' (length=3) 
  36.       'id' => int 7 
  37.       'name' => string 'ahangsan' (length=8) 
  38.       'age' => int 23 
  39.   1 =>  
  40.     array (size=4) 
  41.       'num' => string '003' (length=3) 
  42.       'id' => int 1 
  43.       'name' => string 'bhangsan' (length=8) 
  44.       'age' => int 23 
  45.   2 =>  
  46.     array (size=4) 
  47.       'num' => string '001' (length=3) 
  48.       'id' => int 3 
  49.       'name' => string 'dhangsan' (length=8) 
  50.       'age' => int 23 
  51.   3 =>  
  52.     array (size=4) 
  53.       'num' => string '001' (length=3) 
  54.       'id' => int 6 
  55.       'name' => string 'zhangsan' (length=8) 
  56.       'age' => int 21 
  57. */  

方法2:

[php]  view plain  copy
  1. <?php  
  2. /*二维数组排序*/  
  3.   
  4. // 2.使用array_multisort排序  
  5. $users = array(  
  6.   array('name' => 'tom''age' => 20),   
  7.   array('name' => 'anny''age' => 18),  
  8.   array('name' => 'jack''age' => 22)  
  9. );  
  10. //将age提取出来存储到一维数组里  
  11. $ages = array();  
  12. foreach ($users as $user) {  
  13.   $ages[] = $user['age'];  
  14. }  
  15. //将name提取出来存储到一维数组里  
  16. $names = array();  
  17. foreach ($users as $names) {  
  18.   $names[] = $user['name'];  
  19. }  
  20.   
  21. //按照age升序排列  
  22. array_multisort($ages, SORT_ASC, $users);   
  23. var_dump($users);  
  24. /* 
  25. array (size=3) 
  26.   0 =>  
  27.     array (size=2) 
  28.       'name' => string 'anny' (length=4) 
  29.       'age' => int 18 
  30.   1 =>  
  31.     array (size=2) 
  32.       'name' => string 'tom' (length=3) 
  33.       'age' => int 20 
  34.   2 =>  
  35.     array (size=2) 
  36.       'name' => string 'jack' (length=4) 
  37.       'age' => int 22 
  38.  */  
  39.   
  40.   
  41. //先按年龄升序排列,再按照名称升序排列  
  42. array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);  
  43. var_dump($users);  
  44. /* 
  45. array (size=3) 
  46.   0 =>  
  47.     array (size=2) 
  48.       'name' => string 'anny' (length=4) 
  49.       'age' => int 18 
  50.   1 =>  
  51.     array (size=2) 
  52.       'name' => string 'tom' (length=3) 
  53.       'age' => int 20 
  54.   2 =>  
  55.     array (size=2) 
  56.       'name' => string 'jack' (length=4) 
  57.       'age' => int 22 
  58.  */  

这里顺便说一下PHP排序的几个函数

sort  对数组排序 一般适用于一维索引数组,不会保持索引

rsort  对数组逆向排序 和sort用法一致

asort  对数组进行排序并保持索引关系对值进行排序,一般适用于一维数组,保持索引关系

arsort  对数组进行逆向排序并保持索引关系和asort用法一致

ksort  对数组按照键名排序

krsort  对数组按照键名逆向排序


my github:https://github.com/lensh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值