社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103,点点小课堂(腾讯会议):5696651544

全站通知:

帮助:解析函数/arraysearch

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

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

arraysearch

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

对于一个数组,获取指定值首次出现的位置(从0开始)。没有则返回空。

能额外指定搜索开始位置,和搜索成功或失败时的返回值。

语法

{{#arraysearch: 数组名 | 搜索值 | 开始位置 | 成功值 | 失败值 }}

示例

定义一个数组b{{#arraydefine:b|blue,white,red,white}}

搜索指定元素的位置:

  • {{#arraysearch:b|white}} = 1
  • {{#arraysearch:b|white|2}} = 3
  • {{#arraysearch:b|red}} = 2
  • {{#arraysearch:b|/r.*/}} = 2(正则)
  • {{#arraysearch:b|blu}} = (结果为空)

指定成功/失败时的返回值:

  • {{#arraysearch:b|white|0|yes|no}} = yes
  • {{#arraysearch:b|yellow|0|yes|no}} = no

底层代码

/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
 * locate the index of the first occurrence of an element starting from the 'index'
 *    - print "-1" (not found) or index (found) to show the index of the first occurrence of 'value' in the array identified by arrayid
 *    - if 'yes' and 'no' are set, print value of them when found or not-found
 *    - index is 0-based , it must be non-negative and less than lenth
 * usage:
 *   {{#arraysearch:arrayid|value|index|yes|no}}
 *
 *   See: http://www.php.net/manual/en/function.array-search.php
 *   note it is extended to support regular expression match and index
 */
public static function pfObj_arraysearch( Parser &$parser, PPFrame $frame, $args ) {
	// Get Parameters
	$arrayId = trim( $frame->expand( $args[0] ) );
	$index = isset( $args[2] ) ? trim( $frame->expand( $args[2] ) ) : 0;

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

	if ( $store->arrayExists( $arrayId )
		&& $store->validate_array_index( $arrayId, $index, false )
	) {
		$array = $store->getArray( $arrayId );

		// validate/build search regex:
		if ( isset( $args[1] ) ) {

			$needle = trim( $frame->expand( $args[1] ) );

			if ( !self::isValidRegEx( $needle ) ) {
				$needle = '/^\s*' . preg_quote( trim( $needle ), '/' ) . '\s*$/';
			}
		} else {
			$needle = '/^\s*$/';
		}

		// search for a match inside the array:
		$total = count( $array );
		for ( $i = $index; $i < $total; $i++ ) {
			$value = $array[ $i ];

			if ( preg_match( $needle, $value ) ) {
				// found!
				if ( isset( $args[3] ) ) {
					// Expand only when needed!
					return trim( $frame->expand( $args[3] ) );
				} else {
					// return index of first found item
					return $i;
				}
			}
		}
	}

	// no match! (Expand only when needed!)
	if ( isset( $args[4] ) ) {
		$no = trim( $frame->expand( $args[4] ) );
	} else {
		global $egArraysCompatibilityMode;
		$no = $egArraysCompatibilityMode
			? '-1' // COMPATIBILITY-MODE
			: '';
	}
	return $no;
}
代码逻辑:
  • 函数接受数组名、搜索值、开始位置、成功值和失败值等参数。
  • 通过循环遍历数组,查找匹配搜索值的元素,支持正则表达式匹配。
  • 当找到匹配的元素时,根据参数返回成功值或者元素的索引;未找到时返回失败值或者默认值(空字符串)。
  • 函数通过对数组和参数进行处理,实现了灵活的搜索功能。
  • (其中的 $egArraysCompatibilityMode 始终为 False)

实际用例

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

明日方舟 - arknights

恋与深空 - lysk

崩坏:星穹铁道 - sr

坎特伯雷公主与骑士唤醒冠军之剑的奇幻冒险 - gt

三国杀 - sgs

白荆回廊 - bjhl

雷索纳斯 - resonance

公主连结 - pcr

无期迷途 - wqmt

戴森球计划 - dsp

三国杀OL - sgsol

克鲁赛德战记 - cq

铃兰之剑 - llzj

三国杀移动版 - msgs

忘却前夜 - morimens

食物语-档案馆 - swy

音乐世界Cytus II - cytus2