Arraysort是一个解析函数。帮助:解析函数页列出了所有解析函数的说明。
arraysort
数组排序。出自扩展 Arrays BWIKI和各大Wiki平台广泛使用此扩展。<br>在遥远的未来,它可能与Mediawiki新的并行解析器不兼容,请参阅扩展主页了解更多信息。。
可按多种方式排序数组,包括升序、降序、自然排序、随机和反转等。
注意,排序是基于字符串,而不是数值顺序的。
语法
{{#arraysort: 数组名 | 排序方式 }}
- 排序方式:
- none 不排序
 
- desc 降序
 
- asc 升序
 
- random 随机
 
- reverse 反序
 
- natural 自然排序
 
 
示例
对于数组:{{#arraydefine:x|-10,-1,0,1,3,2,7,6,5,11}} → -10、-1、0、1、3、2、7、6、5、11
{{#arraysort:x}}  →  -10、-1、0、1、3、2、7、6、5、11 
{{#arraysort:x|reverse}}  →  11、5、6、7、2、3、1、0、-1、-10 
{{#arraysort:x|random}}  →  5、1、7、-1、-10、6、3、0、11、2 
{{#arraysort:x|desc}}  →  7、6、5、3、2、11、-10、-1、1、0 
{{#arraysort:x|asc}}  →  0、1、-1、-10、11、2、3、5、6、7 
{{#arraysort:x|natural}}  →  -1、-10、0、1、2、3、5、6、7、11
- 注意:数组元素类型是字符串。
 
更多示例
对于数组:{{#arraydefine:x|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}}
{{#arraysort:x|asc}}  →  0、009、011、10、-1000、-2、3、-5、9 
{{#arraysort:x|nat}}  →  -2、-5、-1000、0、3、009、9、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