Tools 是非官方社区Wiki。社区文档正在编写中,欢迎参与。 Wiki编辑答疑群:717421103
版本250722.2
全站通知:

帮助:解析函数/arraysort

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

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}} → 0、11、2、6、-10、3、-1、1、5、7
{{#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使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考