2010-01-26 14 views

Respuesta

7
array_unique(array_merge($arr[0], $arr[1])); 

o para un caso ilimitado, creo que esto debería funcionar:

$result_arr = array(); 
foreach ($arr as $sub_arr) $result_arr = array_merge($result_arr, $sub_arr); 
$result_arr = array_unique($result_arr); 
+0

Puede tener más de 2 matrices secundarias. – user198729

+0

Puede proporcionar los argumentos con cuántas matrices desea –

+0

El número de matrices secundarias es dinámico. – user198729

13

bien a través de otra pregunta que me di cuenta de que lo que sigue es realmente posible (probé a mí mismo, sin éxito, que tenía el mal versión) si se utiliza versión de PHP> = 5.3.0:

$merged_array = array_reduce($arr, 'array_merge', array()); 

Si desea que los valores únicos que se pueden aplicar array_unique:

$unique_merged_array = array_unique($merged_array); 

Esto funciona si sólo tiene elementos planos en las matrices (es decir, no hay otras matrices). A partir de la documentación:

Nota: Tenga en cuenta quearray_unique() no tiene como objetivo trabajar en matrices multidimensionales.

Si tiene matrices en sus matrices, entonces debe verificarlas manualmente, p. con array_walk:

$unique_values = array(); 

function unique_value($value, &$target_array) { 
    if(!in_array($value, $target_array, true)) 
     $target_array[] = $value; 
} 

array_walk($merged_values, 'unique_value', $unique_values); 

Creo que se puede suponer que los bucles internos (es decir, lo que está haciendo array_walk) son al menos no más lento que los lazos explícitos.

+1

No creo que $ merged_array = array_merge ($ arr); en realidad romperá las sub-matrices, que estoy bastante seguro de que es lo que el OP estaba pidiendo. – sprugman

+0

buen punto. fijo. – sprugman

+2

Vale la pena señalar que array_merge debe estar entre comillas, p. 'array_merge' –

24

Si realmente no quiere bucle, intente esto:

$arr[] = array('A','B'); 
$arr[] = array('C','B'); 
$arr[] = array('C','D'); 
$arr[] = array('F','A'); 
$merged = array_unique(call_user_func_array('array_merge', $arr)); 
+0

¡Por mucho, esto es increíble! :) – Chris

+0

¡Acepta esta respuesta ya! – Ejaz

+0

Creo que no hay necesidad de 'array_unique' ya que' array_merge' sobrescribirá las claves duplicadas si las encuentra. ¿Alguien puede responderme? – Ankit

1

$ merged_array = array_reduce ($ serp_res, 'array_merge', array()); con cuotas adicionales, 'array_merge', funcionó para mí.

1

Esta respuesta se basa en la publicación de Felix Kling. Es una versión más precisa con la fijación de subelementos "sin matriz".

$res = array_reduce($res, function(&$res, $v) { 
          return array_merge($res, (array) $v); 
         }, array()); 
+1

Gran solución y uso array_filter() para deshacerse de elementos de matriz vacíos causados ​​por valores de matriz vacíos o cadenas agregadas previamente. Aquí está la versión final: $ res = array_filter (array_reduce ($ res, function (& $ res, $ v) {return array_merge ($ res, (array) $ v);}, array())); – Tarik

0

Para PHP 5.6 con el operador splat:

array_unique(array_merge(...$arr)); 
0

Una forma sencilla de manejar esto de la Versión PHP> = 5.6 es utilizar el operador splat también llamado Argument Unpacking.

`$ arr = array_unique (array_merge (... $ arr));

Cuestiones relacionadas