PHP 中数组的集合论联合

2022-08-30 12:49:41

数学中有3个集合运算:交集,差分和并集(统一)。在 PHP 中,我们可以使用数组执行以下操作:

  • 路口:array_intersect
  • 差异:array_diff

联合有什么功能?

结果数组中不能有重复项(如 和 )。array_intersectarray_diff

如果索引是数字,则不会覆盖原始值,但会被追加(PHP文档)。array_merge


答案 1

尝试:array_merge

array_unique(array_merge($array1, $array2));

PHP 手册


答案 2

Adrien的答案不一定能从两个按顺序编号的数组生成一个按顺序编号的数组 - 以下是一些选项:

array_values(array_unique(array_merge($array1, $array2)));

(阿德里安的回答,之后重新编号钥匙)

array_keys(array_flip($array1)+array_flip($array2))

(将值放在键中,并使用数组联合运算符)

array_merge($array1, array_diff($array2, $array1))

(在合并之前从第二个数组中删除共享值)

基准测试结果(在我的系统上合并两个长度为 1000 的数组一千次):

  • 独特(阿德里安的版本):2.862163066864秒
  • Values_Unique: 3.12 秒
  • Keys_Flip: 2.34 秒
  • Merge_Diff: 2.64 秒

相同的测试,但两个数组非常相似(至少80%重复):

  • 独特(阿德里安的版本):2.92秒
  • Values_Unique: 3.15 秒
  • Keys_Flip: 1.84 秒
  • Merge_Diff: 2.36 秒

似乎使用数组联合运算符来执行实际联合是最快的方法。但请注意,仅当数组的值是所有字符串或所有整数时,这才是安全的。如果您必须生成对象数组的并集,我建议使用带有 和 的版本。array_fliparray_mergearray_diff