在PHP中设置数组的理论联盟

Dmy*_*nko 30 php arrays

数学中有3组操作:交集,差异和联合(统一).在PHP中,我们可以使用数组执行此操作:

  • 路口: array_intersect
  • 区别: array_diff

联盟的功能是什么?

结果数组中没有重复项(如array_intersectarray_diff).

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

adr*_*ien 54

试试array_merge:

array_unique(array_merge($array1, $array2));
Run Code Online (Sandbox Code Playgroud)

PHP手册

  • PHP的"联合运算符"不执行数学联合.var_dump([1,2] + [3,4])具有[1,2,3,4]的数学联合(由于4个值),但是这两个数组只有两个唯一键,因此脚本将输出[1,2].PHP的"联合"运算符与数学联合完全无关 (7认同)
  • 我不明白为什么这个被接受和支持超过指出联合运算符(+)的答案.我错过了关于联盟运营商的一些事情吗? (2认同)
  • @JoshRibakoff PHP的联合运算符是数组键而不是其值的数学联合。当然,它与数学联合并不是完全没有关系的。您可以使用array_flip将值放入键中,以便应用数组联合运算符-请参阅我的答案。 (2认同)
  • 请注意,如果输入数组包含字符串键,这将不起作用.例如:`php -r'var_dump(array_unique(array_merge(["a"=>"cat","b"=>"dog"],["b"=>"cow","c"=>" hen"])));'`生成['cat','cow','hen']因为具有相同字符串键的值被覆盖.为了避免这个问题,在合并之前调用每个输入数组上的array_values,如下所示:`php -r'var_dump(array_unique(array_merge(array_values(["a"=>"cat","b"=>"dog"]) ,array_values(["b"=>"cow","c"=>"母鸡"]))));'` (2认同)

Bri*_*ian 11

array_unique( array_merge( ... ) )


Bri*_*and 9

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

array_values(array_unique(array_merge($array1, $array2)));
Run Code Online (Sandbox Code Playgroud)

(Adrien的回答是后来重新编号键)

array_keys(array_flip($array1)+array_flip($array2))
Run Code Online (Sandbox Code Playgroud)

(将值放入键中,并使用数组union运算符)

array_merge($array1, array_diff($array2, $array1))
Run Code Online (Sandbox Code Playgroud)

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

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

  • 独特(Adrien的版本):2.862163066864秒
  • Values_Unique:3.12秒
  • Keys_Flip:2.34秒
  • Merge_Diff:2.64秒

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

  • 独特(Adrien的版本):2.92秒
  • Values_Unique:3.15秒
  • Keys_Flip:1.84秒
  • Merge_Diff:2.36秒

似乎使用数组union运算符来做实际联合是最快的方法.但请注意,array_flip只有当数组的值都是字符串或全部整数时才是安全的; 如果你必须生成一个对象数组的联合,我建议用array_merge和的版本array_diff.


RJ *_*oop 6

使用“+”运算符来做到这一点。请参阅链接数组运算符


Osc*_*car 5

使用array_uniquearray_merge在一起.