Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set Theory Union of arrays in PHP

Tags:

arrays

php

There are 3 operations with sets in mathematics: intersection, difference and union (unification). In PHP we can do this operations with arrays:

  • intersection: array_intersect
  • difference: array_diff

What function is for union?

No duplicates can be in the result array (like array_intersect and array_diff).

If indexes are numeric then array_merge will not overwrite the original value, but will be appended (PHP docs).

like image 528
Dmytro Zarezenko Avatar asked May 07 '12 15:05

Dmytro Zarezenko


3 Answers

Try array_merge:

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

PHP Manual

like image 126
adrien Avatar answered Oct 31 '22 13:10

adrien


array_unique( array_merge( ... ) )

like image 45
Brian Avatar answered Oct 31 '22 14:10

Brian


Adrien's answer won't necessary produce a sequentially numbered array from two sequentially numbered arrays - here are some options that will:

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

(Adrien's answer with renumbering the keys afterward)

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

(Put the values in the keys, and use the array union operator)

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

(Remove the shared values from the second array before merging)

Benchmark results (for merging two arrays of length 1000 a thousand times on my system):

  • Unique (Adrien's version): 2.862163066864 seconds
  • Values_Unique: 3.12 seconds
  • Keys_Flip: 2.34 seconds
  • Merge_Diff: 2.64 seconds

Same test, but with the two arrays being very similar (at least 80% duplicate):

  • Unique (Adrien's version): 2.92 seconds
  • Values_Unique: 3.15 seconds
  • Keys_Flip: 1.84 seconds
  • Merge_Diff: 2.36 seconds

It seems using the array union operator to do the actual union is the fastest method. Note however that array_flip is only safe if the array's values are all strings or all integers; if you have to produce the union of an array of objects, I recommend the version with array_merge and array_diff.

like image 12
Brilliand Avatar answered Oct 31 '22 12:10

Brilliand