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

全站通知:

帮助:解析函数/arrayintersect

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

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

arrayintersect

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


两个集合 [math]\displaystyle{ A }[/math][math]\displaystyle{ B }[/math] 的交集,指 [math]\displaystyle{ x \in A }[/math][math]\displaystyle{ x \in B }[/math],下文记为 [math]\displaystyle{ A ∩ B }[/math]

结果数组可能包含重复值,其元素顺序与第一个数组相同;从结果看,可以视为从第一个集合中移除所有其他集合都不存在的元素。

语法

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

此函数将计算 数组1 ∩ 数组2 ∩ ... ∩ 数组n,并将结果存入数组 新数组名

示例

有数组a: {{#arraydefine:a|orange, orange, red, blue}}
有数组b: {{#arraydefine:b|red, red, red, red, orange, yellow, yellow}}
有数组c: {{#arraydefine:c|blue, red}}
a ∩ b : {{#arrayintersect:x|a|b}}{{#arrayprint:x}}orange、orange、red
b ∩ a :{{#arrayintersect:y|b|a}}{{#arrayprint:y}}red、red、red、red、orange
a ∩ b ∩ c : {{#arrayintersect:z|a|b|c}}{{#arrayprint:z}}red

底层代码

/** 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 );
}
其中的multiArrayOperation,会从第一个数组(array_1)开始,对其他所有数组逐一执行 multi_arrayintersect( array_1, array_i )。也就是,将第一个数组与其他数组逐一计算交集;
求交集的核心函数是 PHP 的array_intersect 函数。其比较两个元素是否相同的标准是:(string) $elem1 === (string) $elem2 ,即对PHP语言的字符串转换表达相同。
实际用例
一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考