社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103

全站通知:

帮助:解析函数/arraysort

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

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使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考