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

全站通知:

帮助:解析函数/arrayindex

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

arrayindex是一个解析函数。帮助:解析函数页列出了所有解析函数的说明。

arrayindex

输出一个数组指定位置的值。出自扩展 Arrays BWIKI和各大Wiki平台广泛使用此扩展。<br>在遥远的未来,它可能与Mediawiki新的并行解析器不兼容,请参阅扩展主页了解更多信息。

语法

{{#arrayindex: 数组名 | 序号 | 默认值 }}

  • 序号,一个数字。从0开始计数(第一个元素的序号是0),负数用于从后向前定位(-1代表最后一个元素)
  • 如果数组名或序号无效,函数将输出默认值(默认为空字符串)。
    • 数组名无效:不存在该数组。如在定义数组前使用它的值
    • 序号无效是指:找不到对应位置的值。这可能是序号非数字、越界(超过实际数据范围)导致

示例

{{#arrayindex:a |2 }} → a数组的第3个元素
{{#arrayindex:b |-1 }} → b数组的最后一个元素
{{#arrayindex:c |foo |bad value }} → 因为序号无效,输出默认返回值

底层代码

/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
 * print the value of an array (identified by arrayid)  by the index, invalid index results in the default value  being printed. note the index is 0-based.
 * usage:
 *   {{#arrayindex:arrayid|index}}
**/
public static function pfObj_arrayindex( Parser &$parser, PPFrame $frame, $args ) {
	global $egArraysCompatibilityMode;

	// Get Parameters
	$arrayId    = isset( $args[0] ) ? trim( $frame->expand( $args[0] ) ) : '';
	$rawOptions = isset( $args[2] ) ? $args[2] : '';

	if ( !isset( $args[1] ) ) {
		return '';
	}
	$index = trim( $frame->expand( $args[1] ) );

	// get value or null if it doesn't exist. Takes care of negative index as well
	$val = self::get( $parser )->getArrayValue( $arrayId, $index );

	if ( $val === null || ( $val === '' && !$egArraysCompatibilityMode ) ) {
		// index doesn't exist, return default (parameter 3)!
		// without compatibility, also return default in case of empty string ''

		// only expand default when needed
		$defaultOrOptions = trim( $frame->expand( $rawOptions ) );

		if ( $egArraysCompatibilityMode ) {
			// COMPATIBILITY-MODE
			// now parse the options, and do posterior process on the created array
			$options = self::parse_options( $defaultOrOptions );
			$default = self::array_value( $options, 'default' );
		} else {
			$default = $defaultOrOptions;
		}

		return $default;
	}

	return $val;
}

/**
 * Returns a value within an array. If key or array do not exist, this will return null
 * or another predefined default. $index can also be a negative value, in this case the
 * value that far from the end of the array will be returned.
 *
 * @since 2.0
 *
 * @param string $arrayId
 * @param string $index
 * @param mixed|null $default value to return in case the value doesn't exist. null by default.
 *
 * @return string|null
 */
private function getArrayValue( $arrayId, $index, $default = null ) {
	$arrayId = trim( $arrayId );
	if ( $this->arrayExists( $arrayId )
		&& $this->validate_array_index( $arrayId, $index, true )
		&& array_key_exists( $index, $this->mArrays[ $arrayId ] )
	) {
		return $this->mArrays[ $arrayId ][ $index ];
	} else {
		return $default;
	}
}

代码逻辑简述:

输入参数会先展开wikitext(如展开模板、执行解析函数);
函数会尝试返回数组中指定位置的值,如没有则返回默认值。如果没有设置默认值,就返回空字符串。
其中$egArraysCompatibilityMode始终为 False, 因此代码逻辑非常简单;

实际用例

一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考