问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

PHP数组排序array_multisort函数详细用法跟排序方法是怎样的?_百度知 ...

发布网友 发布时间:2022-04-22 23:00

我来回答

1个回答

热心网友 时间:2022-05-10 15:05

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

$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);
* mp($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;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...的士的.已经好几年了.10年多了好像.想问下.会不会报废? 98年上牌的普桑 现在还能过户吗?手续齐全 年审到2012年9月 宿迁牌照能... 一个圆柱形容器(如图)里面的水深8厘米,把一个底面半径6厘米,高4厘米... ...水的高度是8cm,把一个铁制实心圆锥直立在容器以后 一首轻快地日文歌歌词有a xi da no u mei da DNF第三季70级暴风眼纯刷图加点 dnf暴风眼技能末日暴风需要什么前置技能 70暴风眼加点(暴力点的)(复制狗衮) dnf女柔道纯杀图,觉醒满好还是1好?高手来。。。 榆林神东还招聘员工吗 保温杯泡茶的危害到底有多大? 现在的苹果出口市场行情怎么样?求大神帮助 php如何按数组键值排序? 年后,各地苹果行情如何? 苹果市场价多少 php中对一组数字从大到小排序方法 供求理论分析为什么苹果在消费旺季价格下降,海边别墅却在消费旺季价格上升 用保温杯泡茶好不好? php数组随机排序几种方法 关于PHP冒泡排序法。 运用经济生活的知识预测苹果手机价格可能走势并说明理由 为什么不能用保温杯泡茶? PHP 怎么用冒泡算法进行排序呢 美国苹果股市一直都在上升的原因? php数组排序有很多的方法,哪位可以详细的分解一二吗,如用函数和不用函 ... PHP中的快速排序算法如何实现倒序? 烟台苹果行情是怎样的? 如何使用强大的PHP函数对数组进行排序 PHP快速排序算法实现的原理及代码详解 iphone 12价格下降幅度为什么这么大呢? php冒泡排序法~呢? 今年后期苹果行情会涨吗 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组 最常见的算法,用PHP如何实现 保温杯泡茶易致癌,这是真的吗,为什么? 保温杯泡茶易致癌,这是真的吗,有什么影响呢? php数组怎样排序 order by 在php中怎么排序键值数组 用保温杯泡茶,真的有害健康吗? php中的sort()函数 是什么算法? 川剧的变脸是怎么做到? 川剧变脸,最多变几张脸?回几张呢? php 算法 堆排序 四川川剧中变脸到底是怎么一回事?求详细解说! 是不是保温杯泡茶不好? 教一些最简单的川剧变脸方法 保温杯为何泡茶不好? 川剧变脸是怎么变的? 用保温杯泡茶好么 “川剧变脸揭秘”的过程和原理是什么?