PHP关联数组排序几种方法

对于普通数据排序我们直接使用系统自带数组排序函数即可,如果是关系数组排序你知道如何操作吧?下面来给各位整理了几个例子大家一起来看看吧.

参数说明:$data 目标数组 $key 排序字段, $sort 排序规则,代码如下:

  1. function getSortArray($data,$key,$sort='ASC')
  2. {
  3. if(!is_array($data))
  4. {
  5. return false;
  6. }
  7. $len = count($data);
  8. for($k=1; $k<$len; $k++)
  9. {
  10. for($j=$len-1,$i=0;$i<$len-$k;$i++,$j--)
  11. {
  12. if(strtoupper($sort) == 'DESC')
  13. {
  14. $flag = $data[$j][$key]>$data[$j-1][$key];
  15. }
  16. else
  17. {
  18. $flag = $data[$j][$key]<$data[$j-1][$key];
  19. }
  20. if($flag)
  21. {
  22. $tmp = $data[$j];
  23. $data[$j] = $data[$j-1];
  24. $data[$j-1] = $tmp;
  25. } //开源软件:phpfensi.com
  26. }
  27. }
  28. return $data;
  29. }
  30. //使用方法:
  31. $a = array(
  32. array('name'=>'stone','age'=>17,'sex'=>'男'),
  33. array('name'=>'sunny','age'=>28),
  34. array('name'=>'grass','age'=>16,'sex'=>'女'),
  35. array('name'=>'sea','age'=>15,'birthday'=>'1987-08-16')
  36. );
  37. print_r(getSortArray($a,'age','desc'));
  38. //结果:
  39. Array
  40. (
  41. [0] => Array
  42. (
  43. [name] => sunny
  44. [age] => 28
  45. )
  46. [1] => Array
  47. (
  48. [name] => stone
  49. [age] => 17
  50. [sex] => 男
  51. )
  52. [2] => Array
  53. (
  54. [name] => grass
  55. [age] => 16
  56. [sex] => 女
  57. )
  58. [3] => Array
  59. (
  60. [name] => sea
  61. [age] => 15
  62. [birthday] => 1987-08-16
  63. )
  64. )

不知道你有没有看懂呢?没懂我们再看两个数组排序例子,要对数组针对age字段进行排序,php自带的简单sort功能函数,显然都不能满足需求,因此需要自己写一个快速排序代码来实现相应的需求,代码如下:

  1. <?php
  2. /**
  3. * Description:获取中枢点的位置
  4. *
  5. * @param array $array
  6. * @param int $left
  7. * @param int $right
  8. * @param string $field
  9. * @return int
  10. */
  11. function fetchArrayPivot (&$array, $left, $right, $field)
  12. {
  13. // 基准定义
  14. $stand = $array[$left];
  15. // 遍历数组
  16. while ($left < $right) {
  17. while ($left < $right && $array[$right][$field] >= $stand[$field]) {
  18. $right --;
  19. }
  20. if ($left < $right) {
  21. $array[$left ++] = $array[$right];
  22. }
  23. while ($left < $right && $array[$left][$field] <= $stand[$field]) {
  24. $left ++;
  25. }
  26. if ($left < $right) {
  27. $array[$right --] = $array[$left];
  28. }
  29. }
  30. // 获取中枢点位置
  31. $array[$left] = $stand;
  32. return $left;
  33. }
  34. /**
  35. * Description:快速排序主程序
  36. *
  37. * @param array $array
  38. * @param int $begin
  39. * @param int $end
  40. * @param string $field
  41. */
  42. function quickSort (&$array, $begin, $end, $field)
  43. {
  44. // 变量定义
  45. $pivot = null;
  46. if ($begin < $end) {
  47. $pivot = fetchArrayPivot($array, $begin, $end, $field);
  48. quickSort($array, $begin, $pivot - 1, $field);
  49. quickSort($array, $pivot + 1, $end, $field);
  50. }
  51. }
  52. ?>

调用示例:

  1. <?php
  2. $array = array(
  3. array(
  4. 'name' => "xiao",
  5. 'age' => 3
  6. ),
  7. array(
  8. 'name' => 'wang',
  9. 'age' => 1
  10. ),
  11. array(
  12. 'name' => 'chen',
  13. 'age' => 2
  14. ),
  15. array(
  16. 'name' => 'zhengyi',
  17. 'age' => 4
  18. ),
  19. array(
  20. 'name' => 'chai',
  21. 'age' => 14
  22. )
  23. );
  24. $begin = getTime();
  25. quickSort($array, 0, count($array) - 1, 'age');
  26. print_r($array);
  27. $end = getTime();
  28. $spend = $end - $begin;
  29. //开源软件:phpfensi.com
  30. echo "花费时间为:".$spend."秒n";
  31. function getTime()
  32. {
  33. list($msec, $sec) = explode(" ", microtime());
  34. return (float)$msec + (float)$sec;
  35. }
  36. ?>