帮助:解析函数/arraymap
{{#arraymap: 字符串 | 分隔符 | 占位符 | 输出格式 | 输出分隔符 | 输出连接词 }}
- 官方文档:Extension:Page Forms
arraymap
拆分字符串,并按照指定格式拼接。出自扩展 Page Forms。
比如把字符串 apple, banana, cherry 拆分后,对每个水果名添加链接格式 [[水果:@]],最终输出为 [[水果:apple]], [[水果:banana]], [[水果:cherry]]。
常用于根据原始数据,输出相同结构的内容。数据通常来自模板参数、SMW 查询或表达式结果。
语法
{{#arraymap: 字符串 | 分隔符 | 占位符 | 输出格式 | 输出分隔符 | 输出连接词 }}
参数
- 字符串
- 要处理的原始字符串
- 分隔符
- 拆分用的符号,默认为
,英文逗号。留空时逐字符拆分(包括空格与换行)
- 占位符
- 在"输出格式"中用作替换的标记,通常用
@
- 输出格式
- 包含占位符的 wikitext,解析时会将占位符替换为当前子串。
- 输出分隔符
- 拼接各结果时使用的分隔符,默认
,(逗号+空格)
- 输出连接词
- 替代最后两个元素之间的分隔符,如“和”、“或”。默认与输出分隔符相同
效果
- 输出:将处理后的所有非空元素按指定分隔符和连接词拼接成的字符串
- 效果:对原始字符串的每个元素应用相同的格式转换,空元素和转换后为空的元素会被自动过滤
示例
| 用法 | 代码 | 结果 |
|---|---|---|
| 基本替换 | {{#arraymap: a_b_c | _ | @ | '''@''' | + }}
|
a+b+c |
| 自定义格式 | {{#arraymap: a_b_c | _ | @ | 有'''@'''的内容 | …… }}
|
有a的内容……有b的内容……有c的内容 |
| 添加连接词 | {{#arraymap: 托奇_环理_小满_秘银_从云_辰纱 | _ | @ | [[首页|@]] | , | 和 }}一起开会
|
托奇,环理,小满,秘银,从云 和 辰纱一起开会 |
| 配合模板/函数 | {{#arraymap: apple, banana, cherry | , | @ | {{ucfirst:@}} }}
|
Apple, Banana, Cherry |
| 条件筛选 | {{#arraymap: 2, 7, 4, 9, 3 |,|@|{{#ifexpr: @ > 5 | @ }} }}
|
7, 9 |
使用场景
在模板开发中,经常需要对一组数据应用相同的格式转换。
例如,当模板接收一个逗号分隔的角色列表 托奇,环理,小满 时,可能需要:
- 为每个角色添加链接:
[[角色:托奇]]、[[角色:环理]]、[[角色:小满]] - 或调用角色模板:
{{角色卡片|托奇}} {{角色卡片|环理}} {{角色卡片|小满}}
如果手动处理,需要在模板中为每个可能的元素编写重复的代码,维护困难且无法应对数量不定的情况。
因此 arraymap 的典型应用场景是对数量不定的列表元素批量应用相同的格式转换。
实战中,arraymap最常见问题是多层嵌套导致难以阅读、理解和维护。当格式复杂时,可以通过 arraymaptemplate 调用模板渲染。在需要大量计算或字符串处理时,Lua模块更适合。
底层代码
处理流程:
- 参数提取:从参数数组中提取并展开字符串、分隔符、占位符、输出格式、输出分隔符和连接词,设置默认值
- 分隔符预处理:解除 nowiki 标签,将
\n和\s转换为实际的换行符和空格 - 字符串拆分:若分隔符为空则按字符拆分(UTF-8安全),否则用
explode按分隔符拆分 - 元素遍历处理:对每个非空元素执行以下操作:
- 去除首尾空格
- 展开输出格式模板(不展开参数和模板名)
- 将占位符替换为当前元素值
- 预处理为 DOM 树并完全展开
- 去除首尾空格后,仅保留非空结果
- 连接词处理:若连接词与分隔符不同,在连接词前后添加空格
- 结果拼接:遍历结果数组,使用输出分隔符连接元素,最后两个元素间使用连接词
- 返回输出:返回拼接后的完整字符串

沪公网安备 31011002002714 号