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

帮助:解析函数/arrayintersect

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

arrayintersect

arrayintersect 悬浮框🟢稳定可用
计算多个数组的交集
{{#arrayintersect: 新数组名 | 数组1 | ... | 数组n }}
扩展:Arrays
数组
集合
相关函数
相关资源

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

保留所有数组共有的元素。比如数组 aorange, red, blue,数组 bred, orange, yellow,则交集为 orange, red

通常用于需要找出多组数据共同项的场景,如筛选同时满足多个条件的条目、查找多个分类的共同成员、对比多个查询结果的重叠部分等。

语法

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

参数

新数组名
用于存储交集结果的数组变量名(区分大小写)
数组1, 数组2, ..., 数组n
至少需要两个已定义的数组名
结果以第一个数组为基准:保留其顺序和重复次数,仅过滤掉不在其他所有数组中的元素

效果

  • 输出:无,不直接输出任何字符
  • 效果:创建或更新指定名称的数组变量,存储交集结果;需配合 arrayprint 等函数输出内容
  • 比较规则:基于 PHP 的 array_intersect,按字符串值比较,区分大小写(redRed 视为不同元素)
  • 顺序保留:结果数组的元素顺序和重复次数完全遵循第一个数组,与后续数组无关


示例

定义数组:

  • {{#arraydefine: a | orange, orange, red, blue }}
  • {{#arraydefine: b | red, red, red, red, orange, yellow, yellow }}
  • {{#arraydefine: c | blue, red }}
代码 效果
{{#arrayintersect: x | a | b }}{{#arrayprint: x }} [math]\displaystyle{ a ∩ b }[/math] = orange、orange、red
{{#arrayintersect: y | b | a }}{{#arrayprint: y }} [math]\displaystyle{ b ∩ a }[/math] = red、red、red、red、orange
{{#arrayintersect: z | a | b | c }}{{#arrayprint: z }} [math]\displaystyle{ a ∩ b ∩ c }[/math] = red

边缘示例

代码 效果 说明
{{#arraydefine:empty|}}{{#arrayintersect:result|a|empty}}{{#arrayprint:result}} 任何数组与空数组的交集为空
{{#arraydefine:same|red,red}}{{#arrayintersect:dup|same|same}}{{#arrayprint:dup}} red、red 数组与自身的交集保持原样(包括重复)
{{#arraydefine:case1|Red}}{{#arraydefine:case2|red}}{{#arrayintersect:case|case1|case2}}{{#arrayprint:case}} 大小写敏感,Redred

底层代码

/** mediawiki-extensions-Arrays-REL1_37 ExtArrays.php
 * Usage:
 *    {{#arrayintersect:arrayid_new |array1 |array2 |... |array n}}
 *
 *    Set operation, {red} = {red, white} intersect {red,black}
 *    See: http://www.php.net/manual/en/function.array-intersect.php
 */
public static function pfObj_arrayintersect( &$parser, $frame, $args ) {
	self::get( $parser )->multiArrayOperation( $frame, $args, __FUNCTION__, false );
	return '';
}

private function multi_arrayintersect( $array1, $array2 ) {
	// keys will be preserved!
	return array_intersect( $array1, $array2 );
}

处理流程

  1. 参数解析:提取新数组名和所有待求交集的数组名
  2. 数组验证:检查各数组是否已定义,未定义的视为空数组
  3. 交集计算:从第一个数组开始,依次与后续数组执行 array_intersect 操作
  4. 键值保留:保留第一个数组的键和顺序,仅过滤出所有数组共有的值
  5. 字符串比较:元素比较基于 (string) $elem1 === (string) $elem2,区分大小写
  6. 存储结果:将交集结果存入指定的新数组名
  7. 返回空字符串:函数本身不产生任何输出

技术细节

  • 核心函数是 PHP 的 array_intersect
  • 多个数组的交集通过递归调用实现:[math]\displaystyle{ ((A ∩ B) ∩ C) ∩ D }[/math]
  • 第一个数组的内部键(索引)会被保留,影响后续基于键的操作

实际用例

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