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

帮助:解析函数/arrayslice

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
arrayslice 悬浮框🟢稳定可用
从数组中提取连续片段,创建新数组
{{#arrayslice: 新数组名 | 数组名 | 起始位置 | 长度 }}
扩展:Arrays
数组
切片
子集
相关函数
相关资源

arrayslice

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

比如有数组 {{#arraydefine:items|a,b,c,d,e,f,g}},可以用 {{#arrayslice:subset|items|1|3}} 提取从位置 1 开始的 3 个元素(b、c、d)到新数组。

通常用于分页显示、数据截取、提取局部元素等场景,如从查询结果中提取前 N 条记录、获取列表的最后几项、跳过开头若干元素等操作。

语法

{{#arrayslice: 新数组名 | 数组名 | 起始位置 | 长度 }}

参数

新数组名
保存切片结果的数组变量名(区分大小写)
数组名
要操作的源数组名称
起始位置
切片开始位置,索引从 0 开始计数
支持负数索引:
  • 0 表示第一个元素
  • -1 表示最后一个元素
  • -2 表示倒数第二个元素
长度(可选)
要提取的元素数量
默认值:提取从起始位置到数组末尾的所有元素
若设置为负数或超出范围,结果可能为空数组

效果

  • 输出:不输出任何字符
  • 效果:创建或更新指定名称的新数组,包含从源数组提取的连续元素片段
  • 特殊情况:
    • 若源数组不存在,创建空的新数组
    • 若起始位置无效(非数字),创建空的新数组
    • 若长度参数无效(非数字),自动提取到数组末尾

示例

准备数据: {{#arraydefine:x|a,b,c,d,e,f,g}} → a、b、c、d、e、f、g

代码 效果 说明
{{#arrayslice:y|x|0|2}} a、b 从位置 0 开始提取 2 个元素
{{#arrayslice:y|x|1|3}} b、c、d 从位置 1 开始提取 3 个元素
{{#arrayslice:y|x|2}} c、d、e、f、g 从位置 2 提取到末尾
{{#arrayslice:y|x|-3|2}} e、f 从倒数第 3 个位置开始提取 2 个元素
{{#arrayslice:y|x|-2}} f、g 提取最后 2 个元素
{{#arrayslice:y|x|5|10}} f、g 长度超出范围,提取到末尾
{{#arrayslice:y|notexist|0|3}} 源数组不存在,结果为空数组

底层代码

来自 MediaWiki 及其扩展的源代码,运行在服务端。此处仅供快速查阅,便于更充分的挖掘其"特性"。

/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
 * extract a slice from an array
 * usage:
 *     {{#arrayslice:arrayid_new|arrayid|offset|length}}
 *
 *    extract a slice from an  array
 *    see: http://www.php.net/manual/en/function.array-slice.php
 */
public static function pf_arrayslice( Parser &$parser, $arrayId_new, $arrayId = null, $offset = 0, $length = null ) {
	$store = self::get( $parser );
	if ( $arrayId === null ) {
		global $egArraysCompatibilityMode;
		if ( !$egArraysCompatibilityMode ) { // COMPATIBILITY-MODE
			$store->setArray( $arrayId_new );
		}
		return '';
	}
	// get target array before overwriting it in any way
	$array = $store->getArray( $arrayId );

	// make sure at least an empty array exists if we return early
	$store->setArray( $arrayId_new );

	if ( $array === null
		|| !is_numeric( $offset ) // don't ignore invalid offset
	) {
		return '';
	}

	if ( !is_numeric( $length ) ) {
		$length = null; // ignore invalid input, slice till end
	}

	// array_slice will re-organize keys
	$newArray = array_slice( $array, $offset, $length );
	$store->setArray( $arrayId_new, $newArray );

	return '';
}

处理流程:

  1. 数组获取:从解析器存储中读取源数组数据(其中,$egArraysCompatibilityMode为False)
  2. 初始化新数组:预先创建空的目标数组,确保后续操作有基础结构
  3. 有效性检查:若源数组不存在或起始位置非数字,直接返回(保留空数组)
  4. 长度参数处理:若长度非数字,设为 null 表示提取到末尾
  5. 切片操作:调用 PHP 的 array_slice 函数执行实际切片,该函数会重新组织数组索引
  6. 结果存储:将切片结果保存到新数组变量中
  7. 返回空字符串:函数不产生可见输出

实际用例

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