您当前的位置: 首页 > 网站编程 > PHP教程 > php关于array_multisort多维数组排序的使用说明

php关于array_multisort多维数组排序的使用说明

作者:不详 来源:网络 发布时间: 2011-08-06 13:12 点击:
对于PHP语言中的多维数组排序时最为复杂的一个排序方式。我们在实际编码中将会用到PHP函数array_multisort()来实现这一复杂的排序。 一、先看最简单的情况。有两个数组: 复制代码 代码如下: $arr1 = array(1,9,5); $arr2 = array(6,2,4); array_multisort($arr1,$arr2

php关于array_multisort多维数组排序的使用说明

  对于PHP语言中的多维数组排序时最为复杂的一个排序方式。我们在实际编码中将会用到PHP函数array_multisort()来实现这一复杂的排序。
  一、先看最简单的情况。有两个数组:
  复制代码 代码如下:
  $arr1 = array(1,9,5);
  $arr2 = array(6,2,4);
  array_multisort($arr1,$arr2);
  print_r($arr1); // 得到的顺序是1,5,9
  print_r($arr2); // 得到的顺序是6,4,2
  
  我估计两个数组的值自始至终都是对应着的:1对应6,9对应2,5对应4。
  我们再加多一个数组看看会怎样:
  复制代码 代码如下:
  $arr1 = array(1,9,5);
  $arr2 = array(6,2,4);
  $arr3 = array(3,7,8);
  array_multisort($arr1,$arr2,$arr3);
  
  查看结果,1自始至终都对应6对应3,其它项也是如此。这种对应关系就是手册中所谓的“排序时保留原有的键名关联”。
  另外也可以把每个数组想像成数据库表的一列。而对应着的1,6,3为一数据行,9,2,7为另一数据行。。。
  array_multisort会先按第一个数组(想像成列)排序,如果第一个数组(列)的值相同,则按第二个数组(列)排序。
  具体可以用下面的程式来测试:
  复制代码 代码如下:
  $arr1 = array(1,9,5,9);
  $arr2 = array(6,2,4,1);
  $arr3 = array(3,7,8,0);
  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有什么实际作用。
  我们通常有一些多维数组需要排序:
  $guys = Array
  (
  [0] => Array
  (
  [name] => jake
  [score] => 80
  [grade] => A
  )
  [1] => Array
  (
  [name] => jin
  [score] => 70
  [grade] => A
  )
  [2] => Array
  (
  [name] => john
  [score] => 80
  [grade] => A
  )
  [3] => Array
  (
  [name] => ben
  [score] => 20
  [grade] => B
  )
  )
  例如我们想按成绩倒序排列,如果成绩相同就按名字的升序排列。这时我们就需要根据$guys的顺序多弄两个数组出来:$scores = array(80,70,80,20);$names = array('jake','jin','john','ben');然后array_multisort($scores, SORT_DESC, $names, $guys);就行了还能不能更灵活一点呢,每次想排序都要另外弄些数组出来吗?其实在qeephp的helper_array类里面已经封装得很好,下面是它的两个方法,需要的人自己修改一下就可以用了:
  复制代码 代码如下:
  /**
  * 根据指定的键对数组排序
  *
  * 用法:
  * @code php
  * $rows = array(
  * array('id' => 1, 'value' => '1-1', 'parent' => 1),
  * array('id' => 2, 'value' => '2-1', 'parent' => 1),
  * array('id' => 3, 'value' => '3-1', 'parent' => 1),
  * array('id' => 4, 'value' => '4-1', 'parent' => 2),
  * array('id' => 5, 'value' => '5-1', 'parent' => 2),
  * array('id' => 6, 'value' => '6-1', 'parent' => 3),
  * );
  *
  * $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);
  * dump($rows);
  * // 输出结果为:
  * // array(
  * // array('id' => 6, 'value' => '6-1', 'parent' => 3),
  * // array('id' => 5, 'value' => '5-1', 'parent' => 2),
  * // array('id' => 4, 'value' => '4-1', 'parent' => 2),
  * // array('id' => 3, 'value' => '3-1', 'parent' => 1),
  * // array('id' => 2, 'value' => '2-1', 'parent' => 1),
  * // array('id' => 1, 'value' => '1-1', 'parent' => 1),
  * // )
  * @endcode
  *
  * @param array $array 要排序的数组
  * @param string $keyname 排序的键
  * @param int $dir 排序方向
  *
  * @return array 排序后的数组
  */
  static function sortByCol($array, $keyname, $dir = SORT_ASC)
  {
  return self::sortByMultiCols($array, array($keyname => $dir));
  } /**
  * 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY
  *
  * 用法:
  * @code php
  * $rows = Helper_Array::sortByMultiCols($rows, array(
  * 'parent' => SORT_ASC,
  * 'name' => SORT_DESC,
  * ));
  * @endcode
  *
  * @param array $rowset 要排序的数组
  * @param array $args 排序的键
  *
  * @return array 排序后的数组
  */
  static function sortByMultiCols($rowset, $args)
  {
  $sortArray = array();
  $sortRule = '';
  foreach ($args as $sortField => $sortDir)
  {
  foreach ($rowset as $offset => $row)
  {
  $sortArray[$sortField][$offset] = $row[$sortField];
  }
  $sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
  }
  if (empty($sortArray) || empty($sortRule)) { return $rowset; }
  eval('array_multisort(' . $sortRule . '$rowset);');
  return $rowset;
  }

分享到:
本文"php关于array_multisort多维数组排序的使用说明"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4