2012-05-07 15 views
25

Hay 3 operaciones con conjuntos en matemáticas: intersección, diferencia y unión (unificación). En PHP que podemos hacer estas operaciones con matrices:Establecer teoría Unión de matrices en PHP

  • cruce: array_intersect
  • diferencia: array_diff

Cuál es la función de la unión?

No hay duplicados en la matriz de resultados (como array_intersect y array_diff).

Si los índices son numéricos, entonces array_merge no sobrescribirá el valor original, pero se anexará (PHP docs).

Respuesta

45

Trate array_merge:

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

PHP Manual

+3

1 para 'array_unique' – Sebastian

+2

No entiendo por qué esto es aceptada y upvoted más de las respuestas que señalan el operador de unión (+). ¿Me estoy perdiendo algo sobre el operador sindical? – mwotton

+6

El "operador sindical" de PHP no realiza una unión matemática. var_dump ([1,2] + [3,4]) tiene la unión matemática de [1,2,3,4] (debido a 4 valores), pero las dos matrices solo tienen dos claves únicas, por lo tanto, la secuencia de comandos generará [1,2] El operador de "unión" de PHP no tiene ninguna relación con una unión matemática. –

9

array_unique(array_merge(...))

5

Uso array_unique y array_merge juntos.

4

A partir del código en el PHP: Array Operators documentación:

<?php 
$a = array("a" => "apple", "b" => "banana"); 
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); 

$c = $a + $b; // Union of $a and $b 
echo "Union of \$a and \$b: \n"; 
var_dump($c); 

$c = $b + $a; // Union of $b and $a 
echo "Union of \$b and \$a: \n"; 
var_dump($c); 
?> 

Cuando se ejecuta, este script imprimirá el siguiente:

 
Union of $a and $b: 
array(3) { 
    ["a"]=> 
    string(5) "apple" 
    ["b"]=> 
    string(6) "banana" 
    ["c"]=> 
    string(6) "cherry" 
} 
Union of $b and $a: 
array(3) { 
    ["a"]=> 
    string(4) "pear" 
    ["b"]=> 
    string(10) "strawberry" 
    ["c"]=> 
    string(6) "cherry" 
} 
+0

del [comentario superior] (http://php.net/manual/en/language.operators.array.php#86379) en [PHP: Array Operators] (http://php.net/manual/en /language.operators.array.php) documentación. * "El operador de la unión no se comportó como pensé a primera vista. Implementa una unión (de géneros) basada en las claves de la matriz, no en los valores". * Luego sugiere "array_unique (array_merge) ($ a, $ b)) ' – icc97

+0

He agregado el enlace, pero si va a copiar y pegar directamente desde el código fuente de PHP, debe agregar una referencia. – icc97

0

El operador +:

$x[0] = 4; 
$x[1] = 1; 

$y[0] = 9; 
$y[2] = 5; 

$u = $y + $x; 

// Results in: 
$u[0] === 9; 
$u[1] === 1; 
$u[2] === 5; 

Tenga en cuenta que $x + $y ! = $y + $x

0

Simplemente use $array1 + $array2 Esto dará como resultado la unión de ambas matrices.

6

respuesta de Adrien voluntad no es necesario producir una serie numerada secuencialmente a partir de matrices numeradas dos secuencialmente - aquí hay algunas opciones que:

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

(respuesta de Adrien con renumeración de las llaves después)

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

(Ponga los valores en las claves, y use el operador de la matriz de matriz)

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

(Eliminar los valores compartidos de la segunda matriz antes de la fusión)

resultados

Índice de referencia (para la fusión de dos matrices de longitud 1.000 mil veces en mi sistema):

  • únicos (versión de Adrien): 2.862163066864 segundo
  • Values_Unique: 3.12 segundos
  • Keys_Flip: 2,34 segundos
  • Merge_Diff: 2,64 segundos

misma prueba, pero con las dos matrices de ser muy similar (al menos 80% duplicado):

  • Unique (Adrien de versión): 2,92 segundos
  • Values_Unique: 3.15 segundos
  • Keys_Flip: 1,84 segundos
  • Merge_Diff: 2,36 segundos

Parece que usar el operador de matriz de conjuntos para hacer la unión real es el método más rápido. Sin embargo, tenga en cuenta que array_flip solo es seguro si los valores de la matriz son todas las cadenas o todos los enteros; si tiene que producir la unión de una matriz de objetos, recomiendo la versión con array_merge y array_diff.

4

use el operador "+" para hacerlo. Vea el enlace de Array Operators

+0

El operador + hace ... algo, pero lo que hace definitivamente no es una unión. (I * think * hace una unión de teclas?). Lo que sea que haga generalmente no es tan útil como crees que sería. – GordonM

+0

@GordonM Es incómodo porque el operador '+' se define como la unión de matriz.Tiene razón en que hace una unión de teclas, pero [elige la primera matriz sobre la segunda cuando elimina duplicados] (https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union /) que es lo opuesto a 'array_merge'. – icc97

+0

En realidad, esta respuesta es solo un duplicado de http://stackoverflow.com/a/10485300/327074 y http://stackoverflow.com/a/10485348/327074 – icc97

1
$result = array_merge_recursive($first, $second); 

puede ser útil cuando se tiene matrices con matrices en el interior.