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

全站通知:

帮助:解析函数/arraydefine

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

arraydefine

定义临时存储数据的数组,以便后续使用。出自扩展 Arrays BWIKI和各大Wiki平台广泛使用此扩展。<br>在遥远的未来,它可能与Mediawiki新的并行解析器不兼容,请参阅扩展主页了解更多信息。


此函数需要输入数据字符串和分隔符,用分隔符切分字符串来构造数组。当然,数据字符串可以是固定值,也可以来自模板或SMW查询结果。

基于Arrays扩展,用户能便捷的构造表格、列表和图鉴等各类重复性结构(当然也能用Loops扩展、Lua模块等等)。

语法

{{#arraydefine: 数组名 | 数据字符串 }}
默认以逗号“,”作为分割符,将数据字符串拆分危数组元素。
{{#arraydefine: 数组名 | 数据字符串 | 分隔符 }}
分隔符:可指定分隔符替代默认值,支持正则表达式
{{#arraydefine: 数组名 | 数据字符串 | 分隔符 | 选项 }}
选项 (可选) 是一个匿名字符串参数,支持unique、sort、print。
多个选项参数以英文逗号分隔,即“键=值, 键=值”,例如:“sort=desc, print=list”、“unique, print=list”
unique:去重
sort:排序,支持 none(默认),desc,asce/asc,random,reverse
print 输出格式: list 或 pretty
  • list: a、b、c
  • pretty: a、c和c

示例

{{#arraydefine:a|red}} → 定义数组a,只有1个元素:red
{{#arraydefine:b|orange,red ,yellow, yellow}} → 定义数组b,有4个元素(分隔符没有指定,默认为逗号):orange、red、yellow、yellow
{{#arraydefine:c}} → 定义空数组c:
{{#arraydefine:d|apple, pear; orange|/\s*[;,]\s*/}} → 定义数组d,分隔符是正则表达式。d有3个元素:apple、pear、orange
{{#arraydefine:e|orange,red ,yellow, yellow|,|unique,sort=desc, print=list}} → 定义数组e,以“,”为分隔符,数组元素去重,降序排列,并作为列表输出:yellow、red、orange

相关背景

数组,可理解为一列抽屉,每个抽屉都可以放东西。
定义数组后,就可以从抽屉中取出内容、修改内容,或存放新内容到新抽屉中。
此外,还可以操作这列抽屉,比如排序、搜索和集合操作。
配合arrayprint等输出数组内容的函数,可以将数组中的每个内容都以指定的wikitext格式输出。

}}

底层代码

/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
	* Define an array by a list of 'values' deliminated by 'delimiter',
	* the delimiter should be perl regular expression pattern
	* usage:
	*      {{#arraydefine:arrayid|values|delimiter|options}}
	*
	* http://us2.php.net/manual/en/book.pcre.php
	* see also: http://us2.php.net/manual/en/function.preg-split.php
	*/
public static function pf_arraydefine(
		Parser &$parser,
		$arrayId,
		$value = null,
		$delimiter = '/\s*,\s*/',
		$options = ''
) {
	if ( !isset( $arrayId ) ) {
		return '';
	}

	$out = '';
	$array = [];
	$trimDone = false; // whether or not we can be sure that all array elements are trimmed

	// normalize
	$delimiter = trim( $delimiter );

	if ( $value === null ) {
		// no element set, not even an empty one
		$array = [];
	} else {
		// fill array with user input:
		if ( $delimiter === '' ) {
			// whole input one element, also takes care of special case empty '' value and 'unique' option set
			$array = [ $value ];
			$trimDone = true;
		} else {
			// if no regex delimiter given, build one:
			if ( !self::isValidRegEx( $delimiter ) ) {
				$delimiter = '/\s*' . preg_quote( $delimiter, '/' ) . '\s*/';
				$trimDone = true; // spaces are part of the delimiter now
			}
			$array = preg_split( $delimiter, $value );
		}

		// trim all values before unique if still necessary, otherwise unique might not work correctly
		if ( !$trimDone ) {
			$array = self::sanitizeArray( $array );
		}

		// now parse the options, and do posterior process on the created array
		$arrayOptions = self::parse_options( $options );

		// make it unique if option is set
		if ( array_key_exists( 'unique', $arrayOptions ) ) {
			// unique like the parser function would do it
			$array = self::array_unique( $array );
		}

		// if 'singleempty' is NOT set, {{#arraydefine:a|}} will be empty.
		// by default this would give an empty array (due to historical as well as usability reasons)
		if ( !array_key_exists( 'singleempty', $arrayOptions ) ) {
			// there is no other uncomplicated way than this to define a single empty elemented array currently!
			if ( count( $array ) === 1 && $array[0] === '' ) {
				$array = [];
			}
		}

		// sort array if the option is set
		if ( array_key_exists( 'sort', $arrayOptions ) ) {
			$array = self::arraySort( $array, self::array_value( $arrayOptions, 'sort' ) );
		}

		// print the array upon request
		switch ( self::array_value( $arrayOptions, 'print' ) ) {
			case 'list':
				// simple list output
				$out = implode( self::$mDefaultSep, $array );
				break;
			case 'pretty':
				global $wgLang;
				$out = $wgLang->listToText( $array );
				break;
		}
	}

	self::get( $parser )->setArray( $arrayId, $array );

	return $out;
}
代码虽长,但行为简单。
  1. 用分隔符(delimiter)分割数据字符串(value)。如分隔符为空则不分割,数组将只包含一个元素。
  2. 如有选项 unique,去重
  3. 如有选项 sort,按指定方式排序
  4. 如有选项 print,按指定格式输出
  5. 存储。按照指定数组名(忽略头尾空格)存储数组到变量中
  • 还支持选项singleempty。当数组仅有一个值,且为空字符串时,此选项能保留它(否则空字符串将被过滤,仅保留空数组)