Chinaunix首页 | 论坛 | 博客
  • 博客访问: 319681
  • 博文数量: 96
  • 博客积分: 230
  • 博客等级: 二等列兵
  • 技术积分: 722
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-13 22:25
个人简介

心安处即吾乡!

文章分类

全部博文(96)

文章存档

2016年(1)

2014年(79)

2013年(7)

2012年(9)

我的朋友

分类: PHP

2014-06-09 14:38:00

今天研究了一下php的array_multisort,理解了之后发现他很强大,而且也不复杂。(手册上关于这个函数的讲解看得很费力)

一、先看最简单的情况。有两个数组:

点击(此处)折叠或打开

  1. $arr1 = array(1,9,5);
  2. $arr2 = array(6,2,4);
  3.  
  4. array_multisort($arr1,$arr2);
  5.  
  6. print_r($arr1); // 得到的顺序是1,5,9
  7. print_r($arr2); // 得到的顺序是6,4,2

我估计两个数组的值自始至终都是对应着的:1对应6,9对应2,5对应4。

我们再加多一个数组看看会怎样:


点击(此处)折叠或打开

  1. $arr1 = array(1,9,5);
  2. $arr2 = array(6,2,4);
  3. $arr3 = array(3,7,8);
  4.  
  5. array_multisort($arr1,$arr2,$arr3);


查看结果,1自始至终都对应6对应3,其它项也是如此。这种对应关系就是手册中所谓的“排序时保留原有的键名关联”。

另外也可以把每个数组想像成数据库表的一列。而对应着的1,6,3为一数据行,9,2,7为另一数据行。。。

array_multisort会先按第一个数组(想像成列)排序,如果第一个数组(列)的值相同,则按第二个数组(列)排序。

具体可以用下面的程式来测试:


点击(此处)折叠或打开

  1. $arr1 = array(1,9,5,9);
  2. $arr2 = array(6,2,4,1);
  3. $arr3 = array(3,7,8,0);
  4.  
  5. array_multisort($arr1,$arr2,$arr3);


可以想像这里$arr3的结果是(3,8,0,7)。

二、接下来讲解array_multisort的参数。这个函数的参数很灵活。最简单的情况是如上面所示的以1个或n个数组作为参数,需要注意的是每个数组的项数要一样,否则会warning导致排序失效。

像这样array_multisort($arr1,$arr2,$arr3); 默认是所有数组都是升序排列,如果想对$arr2降序,并当作字符串去比较,就要写成:

array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);

每个array后面可以跟一个排序顺序标志或一个排序类型标志,或者两种标志同时出现。但是每种排序标志在每个数组后面只能出现一个。

详细如下:

排序顺序标志:

SORT_ASC – 按照上升顺序排序(默认)

SORT_DESC – 按照下降顺序排序

排序类型标志:

SORT_REGULAR – 将项目按照通常方法比较(默认)

SORT_NUMERIC – 将项目按照数值比较

SORT_STRING – 将项目按照字符串比较

三、最后是array_multisort有什么实际作用。

我们通常有一些多维数组需要排序:


点击(此处)折叠或打开

  1. $guys = Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [name] => jake
  6.             [score] => 80
  7.             [grade] => A
  8.         )
  9.  
  10.     [1] => Array
  11.         (
  12.             [name] => jin
  13.             [score] => 70
  14.             [grade] => A
  15.         )
  16.  
  17.     [2] => Array
  18.         (
  19.             [name] => john
  20.             [score] => 80
  21.             [grade] => A
  22.         )
  23.  
  24.     [3] => Array
  25.         (
  26.             [name] => ben
  27.             [score] => 20
  28.             [grade] => B
  29.         )
  30.  
  31. )


例如我们想按成绩倒序排列,如果成绩相同就按名字的升序排列。
这时我们就需要根据$guys的顺序多弄两个数组出来:


点击(此处)折叠或打开

  1. $scores = array(80,70,80,20);
  2. $names = array('jake','jin','john','ben');
  3. 然后
  4. array_multisort($scores, SORT_DESC, $names, $guys);就行了


还能不能更灵活一点呢,每次想排序都要另外弄些数组出来吗?
其实在qeephp的helper_array类里面已经封装得很好,下面是它的两个方法,需要的人自己修改一下就可以用了:

点击(此处)折叠或打开

  1. /**
  2.  * 根据指定的键对数组排序
  3.  *
  4.  * 用法:
  5.  * @code php
  6.  * $rows = array(
  7.  * array('id' => 1, 'value' => '1-1', 'parent' => 1),
  8.  * array('id' => 2, 'value' => '2-1', 'parent' => 1),
  9.  * array('id' => 3, 'value' => '3-1', 'parent' => 1),
  10.  * array('id' => 4, 'value' => '4-1', 'parent' => 2),
  11.  * array('id' => 5, 'value' => '5-1', 'parent' => 2),
  12.  * array('id' => 6, 'value' => '6-1', 'parent' => 3),
  13.  * );
  14.  *
  15.  * $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);
  16.  * dump($rows);
  17.  * // 输出结果为:
  18.  * // array(
  19.  * // array('id' => 6, 'value' => '6-1', 'parent' => 3),
  20.  * // array('id' => 5, 'value' => '5-1', 'parent' => 2),
  21.  * // array('id' => 4, 'value' => '4-1', 'parent' => 2),
  22.  * // array('id' => 3, 'value' => '3-1', 'parent' => 1),
  23.  * // array('id' => 2, 'value' => '2-1', 'parent' => 1),
  24.  * // array('id' => 1, 'value' => '1-1', 'parent' => 1),
  25.  * // )
  26.  * @endcode
  27.  *
  28.  * @param array $array 要排序的数组
  29.  * @param string $keyname 排序的键
  30.  * @param int $dir 排序方向
  31.  *
  32.  * @return array 排序后的数组
  33.  */
  34. static function sortByCol($array, $keyname, $dir = SORT_ASC)
  35. {
  36.     return self::sortByMultiCols($array, array($keyname => $dir));
  37. }
  38. /**
  39.  * 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY
  40.  *
  41.  * 用法:
  42.  * @code php
  43.  * $rows = Helper_Array::sortByMultiCols($rows, array(
  44.  * 'parent' => SORT_ASC,
  45.  * 'name' => SORT_DESC,
  46.  * ));
  47.  * @endcode
  48.  *
  49.  * @param array $rowset 要排序的数组
  50.  * @param array $args 排序的键
  51.  *
  52.  * @return array 排序后的数组
  53.  */
  54. static function sortByMultiCols($rowset, $args)
  55. {
  56.     $sortArray = array();
  57.     $sortRule = '';
  58.     foreach ($args as $sortField => $sortDir)
  59.     {
  60.         foreach ($rowset as $offset => $row)
  61.         {
  62.             $sortArray[$sortField][$offset] = $row[$sortField];
  63.         }
  64.         $sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
  65.     }
  66.     if (empty($sortArray) || empty($sortRule)) { return $rowset; }
  67.     eval('array_multisort(' . $sortRule . '$rowset);');
  68.     return $rowset;
  69. }


阅读(1062) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~