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

帮助:解析函数/arraymerge

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
arraymerge 悬浮框🟢稳定可用
合并多个数组为一个数组
{{#arraymerge: 新数组名 | 数组1 | ... | 数组n }}
扩展:Arrays
数组
集合
相关函数
相关资源

arraymerge

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

比如将数组 a=[orange]b=[red, red] 合并为 x=[orange, red, red],元素会按顺序依次追加,且保留重复元素。

通常用于需要整合多个来源数据的场景,如合并多次 SMW 查询结果、整合不同分类的条目列表、汇总多个模板参数等批量数据处理任务。

语法

{{#arraymerge: 新数组名 | 数组1 | 数组2 | ... | 数组n }}

参数

新数组名
存放合并结果的目标数组名称(区分大小写)
数组1..n
要合并的已定义数组,至少需要两个

效果

  • 输出:不输出任何字符
  • 效果:创建或更新指定名称的数组变量,将所有源数组的元素按顺序依次追加到新数组中。合并规则遵循 PHP 的 array_merge
    • 数字键会重新编号(0, 1, 2...)
    • 字符串键保留原名(同名键时后者覆盖前者)
    • 不会自动去重,保留所有元素包括重复项


示例

先定义数组abc:

  • a: {{#arraydefine:a|orange}}
  • b: {{#arraydefine:b|red, red}}
  • c: {{#arraydefine:c|blue, blue}}
代码 结果数组内容
{{#arraymerge:x|a|b}} x = orange、red、red
{{#arraymerge:x|c|a}} x = blue、blue、orange
{{#arraymerge:x|a|b|c}} x = orange、red、red、blue、blue
{{#arraymerge:x|b|c}} x = red、red、blue、blue(保留重复)

使用场景

arraymerge 的典型应用场景是需要汇总多个数据源但保留原始顺序和重复项时,例如:

合并多次查询结果

当一次 SMW 查询无法满足复杂条件时,可分别查询后合并:

{{#arraydefine:list1|{{#ask:[[分类:帮助]]|link=none|limit=5|searchlabel=}}}}
{{#arraydefine:list2|{{#ask:[[分类:文档]]|link=none|limit=5|searchlabel=}}}}
{{#arraymerge:allItems|list1|list2}}
{{#arrayprint:allItems|、|@@@|[[@@@]]}}

整合模板多个参数

将用户传入的多个列表参数合并为统一数组处理:

{{#arraydefine:fruits|{{{水果|}}}}}
{{#arraydefine:vegetables|{{{蔬菜|}}}}}
{{#arraymerge:allFood|fruits|vegetables}}

逐步构建复杂列表

在循环或条件判断中分步构建最终数据集:

{{#arraydefine:base|基础项1,基础项2}}
{{#if:{{{扩展|}}}|
  {{#arraydefine:extra|{{{扩展}}}}}
  {{#arraymerge:final|base|extra}}
|
  {{#arraydefine:final|base}}
}}

底层代码

/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
 * Merge values two arrayes identified by arrayid1 and arrayid2 into a new array identified by arrayid_new.
 * This merge differs from array_merge of php because it merges values.
 *
 * Usage:
 *    {{#arraymerge:arrayid_new |array1 |array2 |... |array n}}
 *    See: http://www.php.net/manual/en/function.array-merge.php
 */
public static function pfObj_arraymerge( &$parser, $frame, $args ) {
	self::get( $parser )->multiArrayOperation( $frame, $args, __FUNCTION__, false );
	return '';
}

private function multi_arraymerge( $array1, $array2 ) {
	// keys will not be re-organized
	return array_merge( $array1, $array2 );
}

处理流程

  1. 参数解析:提取新数组名和所有源数组名
  2. 数组验证:检查所有源数组是否已定义
  3. 顺序合并:从第一个源数组开始,使用 PHP 的 array_merge 逐一合并后续数组
  4. 键处理:数字键重新编号,字符串键保留(同名时后者覆盖前者)
  5. 存储结果:将合并后的数组存入解析器上下文,以新数组名标识
  6. 返回空串:函数本身不输出任何内容

实际用例

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