Arraysort是一个解析函数。帮助:解析函数页列出了所有解析函数的说明。
arraysort
数组排序。出自扩展 Arrays BWIKI和各大Wiki平台广泛使用此扩展。<br>在遥远的未来,它可能与Mediawiki新的并行解析器不兼容,请参阅扩展主页了解更多信息。。
语法
{{#arraysort:数组名|排序方式}}
- 排序方式:
- none 不排序
- desc 降序
- asc 升序
- random 随机
- reverse 反序
示例
对于数组:{{#arraydefine:x|1,3,2,7,6,5,11}}
→ 1、3、2、7、6、5、11
{{#arraysort:x}}
→ 1、3、2、7、6、5、11
{{#arraysort:x|reverse}}
→ 11、5、6、7、2、3、1
{{#arraysort:x|random}}
→ 7、5、6、2、11、1、3
{{#arraysort:x|desc}}
→ 7、6、5、3、2、11、1
{{#arraysort:x|asc}}
→ 1、11、2、3、5、6、7
- 注意:数组元素类型是字符串,因此顺序排序结果为 1、11、2、3
更多示例
从源码分析,arraysort还支持排序方式nat
,使用“自然排序”算法(基于PHP natsort 函数)。
对于数组:{{#arraydefine:x|img12.png, img10.png, img2.png, img1.png}}
→ img12.png、img10.png、img2.png、img1.png
{{#arraysort:x|asc}}
→ img10.png、img12.png、img1.png、img2.png
{{#arraysort:x|nat}}
→ img1.png、img2.png、img10.png、img12.png (比 asc 更符合“人类直觉”)
对于数组:{{#arraydefine:x|-5,3,-2,0,-1000,9,009,10,011}}
→ -5、3、-2、0、-1000、9、009、10、011
{{#arraysort:x|nat}}
→ -2、-5、-1000、0、3、9、009、10、011(其特性不一定完全符合“人类直觉”)
底层代码
/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
* sort specified array in the following order:
* - none: No sort (default)
* - desc: In descending order, large to small
* - asce: In ascending order, small to large
* - random: Shuffle the arrry in random order
* - reverse: Return an array with elements in reverse order
* usage:
* {{#arraysort:arrayid|order}}
*
* see: http://www.php.net/manual/en/function.sort.php
* http://www.php.net/manual/en/function.rsort.php
* http://www.php.net/manual/en/function.shuffle.php
* http://us3.php.net/manual/en/function.array-reverse.php
*/
public static function pf_arraysort( Parser &$parser, $arrayId, $sort = 'none' ) {
$store = self::get( $parser );
$array = $store->getArray( $arrayId );
if ( $array === null ) {
return '';
}
// sort array and store it
$array = self::arraySort( $array, $sort );
$store->setArray( $arrayId, $array );
return '';
}
/**
* Sorts an array just like parser function '#arraysort' would do it and allows the
* same sort modes.
*
* @since 2.0
*
* @param array $array
* @param string $sortMode one of the following sort modes:
* - random: random array order
* - reverse: last entry will be first, first the last.
* - asce: sort array in ascending order.
* - desc: sort array in descending order.
* - natural: sort with a 'natural order' algorithm. See PHPs natsort() function.
*
* In addition, this function allows to set several flags behind the sort mode. The must be
* separated by a space. The following keys are allowed:
* - nolocale: will prevent 'asce' and 'desc' mode to considering PHP-defined language rules.
*
* @return array
*/
public static function arraySort( array $array, $sortMode ) {
global $egArraysCompatibilityMode;
$flags = preg_split( '/\s+/s', $sortMode );
$sortMode = array_shift( $flags ); // first string is the actual sort mode
$localeFlag = SORT_LOCALE_STRING; // sort strings accordingly to what was set via setlocale()
if (
in_array( 'nolocale', $flags )
|| $egArraysCompatibilityMode // COMPATIBILITY-MODE
) {
// 'nolocale' will prevent from using this flag!
$localeFlag = null;
}
// do the requested sorting of the given array:
switch ( $sortMode ) {
case 'asc':
case 'asce':
case 'ascending':
sort( $array, $localeFlag );
break;
case 'desc':
case 'descending':
rsort( $array, $localeFlag );
break;
case 'nat':
case 'natural':
natsort( $array );
break;
case 'rand':
case 'random':
shuffle( $array );
break;
case 'reverse':
$array = array_reverse( $array );
break;
}
return $array;
}
- 代码逻辑:
- 函数基于传入的排序方式对数组进行排序。
- 如果目标数组存在,则根据指定排序方式调用 arraySort 方法对数组进行排序。
- 排序后的数组再次存储回原来的数组中。
- 此外,阅读 arraySort 方法可以获知,排序方式名称支持多种写法。也可以指定排序方式为 nat 来使用 natsort 进行“自然排序”。(其中 $egArraysCompatibilityMode 为False)
实际用例
- 一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时,仅供批判性参考。
MediaWiki:WikiparserHighlight
MediaWiki:WikiparserHighlight.css