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

全站通知:

帮助:解析函数/arrayreset

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

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

arrayreset

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

用于删除由Arrays扩展定义的数组。

语法

删除指定数组:{{#arrayreset: 数组名1 |数组名2 | ... | 数组名n }}
删除所有数组:{{#arrayreset:}}

示例

有数组a, b, c:{{#arraydefine:a|orange, red}} {{#arraydefine:b|111, 22222}} {{#arraydefine:c}}
他们的Size为:a (size=2)、b (size=2)、c (size=0)和不存在的d (size=)


现在删除a:{{#arrayreset:a}}


再次查看Size:a (size=)、b (size=2)、c (size=0)和不存在的d (size=)
容易看出,一个空数组c的size是0,而被清除后的数组a的size是空,与不存在的d一致,可以验证a确实被删除了。

底层代码

/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
 * reset some or all defined arrayes
 * usage:
 *    {{#arrayreset:}}
 *    {{#arrayreset:arrayid1,arrayid2,...arrayidn}}
 */
public static function pfObj_arrayreset( Parser &$parser, PPFrame $frame, $args ) {
	global $egArraysCompatibilityMode;

	if ( $egArraysCompatibilityMode && count( $args ) == 1 ) {
		/*
			* COMPATIBILITY-MODE: before arrays were separated by ';' which is an bad idea since
			* the ',' is an allowed character in array names!
			*/
		$args = preg_split( '/\s*,\s*/', trim( $frame->expand( $args[0] ) ) );
	}

	$store = self::get( $parser );

	// reset all hash tables if no specific tables are given:
	if ( !isset( $args[0] ) || ( $args[0] === '' && count( $args ) == 1 ) ) {
		// reset ALL arrays!
		$store->mArrays = [];
	} else {
		// reset specific hash tables:
		foreach ( $args as $arg ) {
			$arrayId = trim( $frame->expand( $arg ) );
			$store->unsetArray( $arrayId );
		}
	}
	return '';
}
/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
 * Removes an existing array. If array didn't exist this will return false, otherwise true.
 *
 * @since 2.0
 *
 * @param string $arrayId
 *
 * @return bool whether the array existed and has been removed
 */
public function unsetArray( $arrayId ) {
	$arrayId = trim( $arrayId );
	if ( $this->arrayExists( $arrayId ) ) {
		unset( $this->mArrays[ $arrayId ] );
		return true;
	}
	return false;
}

代码逻辑:

  • 其中 $egArraysCompatibilityMode 为 False,仅在老版本(1.4 alpha前)支持在参数1中用逗号分割多个数组名。
  • 如果参数1为空(即{{#arrayreset:}} ),清空所有数组($store->mArrays = [];
  • 否则遍历参数(并展开wikitext),移除指定数组($store->unsetArray( $arrayId )).
  • 代码中也附带了函数 unsetArray 的源码,unset() 是 PHP 内置函数,用于销毁变量或数组元素。

实际用例

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