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

$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数组排列的更多相关文章

  1. Java利用递归算法统计1-6的数组排列组合数

    Java利用递归算法统计1-6的数组排列组合数 1.设计源码 /** * @Title:ArrayCombination.java * @Package:com.you.data * @Descrip ...

  2. 数组排列组合问题——BACKTRACKING

    BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...

  3. JavaScript 二维数组排列组合2

    <html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...

  4. JavaScript 二维数组排列组合

    <html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...

  5. 5_PHP数组_3_数组处理函数及其应用_7_数组排列函数

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组排列函数 1. sort() 函数 程序: <?php $array = array("img ...

  6. js数组 把竖向数组排列为横向数组

    项目中会遇到为了渲染方便要把后台给的竖向数组排列为横向数组 例:后台传回的数组为[2004, 2005, 2006, 2007, 2008] [46890000, 55900500, 33786400 ...

  7. 剑指offer-第五章优化时间和空间效率(把数组排列成最小的数)

    题目:输入一个正整数数组,将所有的数,排列起来,组成一个最小的数.

  8. 【LeetCode】数组排列问题(permutations)(附加next_permutation解析)

    描述 Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3 ...

  9. 9月19日下午JavaScript数组冒泡排列和二分法

    数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...

随机推荐

  1. ceilometer

    控制节点: ceilometer-api: /etc/init.d/openstack-ceilometer-api  status ceilometer-collector /etc/init.d/ ...

  2. QT 常用设置

    博文都写在了云笔记里面了,见谅,不想维护两个版本. QT 常用设置

  3. 安装FreeMind

    Freemind 1.0.0 官方正式版下载地址:http://dl.pconline.com.cn/html_2/1/131/id=46751&pn=0.html 软件介绍: Freemin ...

  4. Oracle datafile特殊字符处理

    1.发现数据库的数据文件有特殊字符: 2.尝试在sqlplus下用将tablespace offline后修改 SQL> alter tablespace WST_DATA rename dat ...

  5. Stop a hung service 关闭一个无响应的windows 服务

    If you ever have trouble with a service being stuck in a 'starting' or 'stopping' state, you can run ...

  6. navigationController Pop回指定页面

    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIn ...

  7. 视频边下边播--缓存播放数据流-b

    google搜索“iOS视频变下边播”,有好几篇博客写到了实现方法,其实只有一篇,其他都是copy的,不过他们都是使用的本地代理服务器的方式. 原理很简单,但是缺点也很明显,需要自己写一个本地代理服务 ...

  8. win10应用安装位置修改方法

    win10应用安装位置怎么改?很多用户升级win10的系统之后,对于win10应用装置的位置如何修改一直不知道如何解决,今天,小编就跟大家一起来看看如何修改win10应用装置的位置. win10应用安 ...

  9. Decision Boundaries for Deep Learning and other Machine Learning classifiers

    Decision Boundaries for Deep Learning and other Machine Learning classifiers H2O, one of the leading ...

  10. 解决Linux/aix 下的websphere log4j不生效

    websphere 解决Linux/aix下的log4j不生效 在目录: /IBM/WebSphere/AppServer/profiles/AppSrv01/properties 增加一个文件:可以 ...