PHP实现的多维数组排序算法分析

本文实例讲述了PHP实现的多维数组排序算法。分享给大家供大家参考,具体如下:

突然想起了一道面试题,把一个多维数组排序。

例:

  1. <?php
  2. //有一个多维数组
  3. $a = array(
  4. array('key1'=>940, 'key2'=>'blah'),
  5. array('key1'=>23, 'key2'=>'this'),
  6. array('key1'=>894, 'key2'=>'that')
  7. );
  8. //那么怎么对key1或者key2进行排序呢,这里就需要使用到usort($arr, 'myfunction')函数了,它的作用是对$arr使用我们自定义的方法进行排序,具体使用方法可以查看手册
  9. //1.对key1的值进行排序
  10. function asc_key1_sort($x, $y) {
  11. //可以输出一下看看是怎么比较的
  12. echo 'Iteration:'.$x['key1'].' vs '.$y['key1'];
  13. if($x['key1'] > $y['key1']) {
  14. echo 'true<br/>';
  15. return true;
  16. }elseif($x['key1'] < $y['key1']) {
  17. echo 'false<br/>';
  18. return false;
  19. }else {
  20. echo '0';
  21. return 0;
  22. }
  23. }
  24. //进行排序
  25. usort($a, 'asc_key1_sort');
  26. var_dump($a);
  27. //2.对key2字符进行排序
  28. function asc_key2_sort($x, $y) {
  29. //可以使用strcasecmp()函数进行排序
  30. echo 'Iteration:'.$x['key2'].' vs '.$y['key2'].'<br/>';
  31. return strcasecmp($x['key2'], $y['key2']);
  32. }
  33. //进行排序
  34. usort($a, 'asc_key2_sort');
  35. var_dump($a);
  36. ?>

运行结果:

  1. Iteration:23 vs 940false
  2. Iteration:894 vs 23true
  3. Iteration:940 vs 23true
  4. Iteration:894 vs 940false
  5. array(3) { [0]=> array(2) { ["key1"]=> int(23) ["key2"]=> string(4) "this" } [1]=> array(2) { ["key1"]=> int(894) ["key2"]=> string(4) "that" } [2]=> array(2) { ["key1"]=> int(940) ["key2"]=> string(4) "blah" } } Iteration:that vs this
  6. Iteration:blah vs that
  7. array(3) { [0]=> array(2) { ["key1"]=> int(940) ["key2"]=> string(4) "blah" } [1]=> array(2) { ["key1"]=> int(894) ["key2"]=> string(4) "that" } [2]=> array(2) { ["key1"]=> int(23) ["key2"]=> string(4) "this" } }

如果我的多维数组中也有key值呢?

  1. <?php
  2. //有一个多维数组
  3. $a = array(
  4. 123 => array('key1'=>940, 'key2'=>'blah'),
  5. 349 => array('key1'=>23, 'key2'=>'this'),
  6. 43 => array('key1'=>894, 'key2'=>'that')
  7. );
  8. //那么怎么对key1或者key2进行排序呢,这里就需要使用到usort($arr, 'myfunction')函数了,它的作用是对$arr使用我们自定义的方法进行排序,具体使用方法可以查看手册
  9. //1.对key1的值进行排序
  10. function asc_key1_sort($x, $y) {
  11. //可以输出一下看看是怎么比较的
  12. echo 'Iteration:'.$x['key1'].' vs '.$y['key1'];
  13. if($x['key1'] > $y['key1']) {
  14. echo 'true<br/>';
  15. return true;
  16. }elseif($x['key1'] < $y['key1']) {
  17. echo 'false<br/>';
  18. return false;
  19. }else {
  20. echo '0';
  21. return 0;
  22. }
  23. }
  24. //进行排序
  25. usort($a, 'asc_key1_sort');
  26. var_dump($a);
  27. //2.对key2字符进行排序
  28. function asc_key2_sort($x, $y) {
  29. //可以使用strcasecmp()函数进行排序
  30. echo 'Iteration:'.$x['key2'].' vs '.$y['key2'].'<br/>';
  31. return strcasecmp($x['key2'], $y['key2']);
  32. } //phpfensi.com
  33. //进行排序
  34. usort($a, 'asc_key2_sort');
  35. var_dump($a);
  36. ?>

运行结果:

  1. Iteration:23 vs 940false
  2. Iteration:894 vs 23true
  3. Iteration:940 vs 23true
  4. Iteration:894 vs 940false
  5. array(3) { [0]=> array(2) { ["key1"]=> int(23) ["key2"]=> string(4) "this" } [1]=> array(2) { ["key1"]=> int(894) ["key2"]=> string(4) "that" } [2]=> array(2) { ["key1"]=> int(940) ["key2"]=> string(4) "blah" } } Iteration:that vs this
  6. Iteration:blah vs that
  7. array(3) { [0]=> array(2) { ["key1"]=> int(940) ["key2"]=> string(4) "blah" } [1]=> array(2) { ["key1"]=> int(894) ["key2"]=> string(4) "that" } [2]=> array(2) { ["key1"]=> int(23) ["key2"]=> string(4) "this" } }

这样的排序结果不会保留123,349,43。这时候只要把usort()换成uasort就好啦!