2010-05-21 19 views
7

tengo estas dos matrices:comparar dos matrices asociativas y crear una nueva matriz con las matrices coincidentes, PHP

$arr1=array( array("id" => 8, "name" => "test1"), 
       array("id" => 4, "name" => "test2"), 
       array("id" => 3, "name" => "test3") 
      ); 

$arr2=array( array("id" => 3), 
       array("id" => 4) 
      ); 

¿Cómo puedo "extraer" matrices de $ arr1, donde id tiene mismo valor en $ arr2 , en una nueva matriz y dejar la matriz extraída también en una nueva matriz, sin tener en cuenta los pedidos de tecla?

La salida busco debe ser:

$arr3=array(
       array("id" => 8, "name" => "test1") 
      ); 

$arr4=array( array("id" => 4, "name" => "test2"), 
       array("id" => 3, "name" => "test3") 
      ); 

Gracias

Respuesta

6

Estoy seguro de que hay algunas funciones de matriz mágicos ya hechas que pueden manejar esto, pero aquí hay un ejemplo básico:

$ids = array(); 
foreach($arr2 as $arr) { 
    $ids[] = $arr['id']; 
} 

$arr3 = $arr4 = array(); 
foreach($arr1 as $arr) { 
    if(in_array($arr['id'], $ids)) { 
     $arr4[] = $arr; 
    } else { 
     $arr3[] = $arr; 
    } 
} 

La salida será la misma que la que desea. ejemplo vivo:

http://codepad.org/c4hOdnIa

+0

De hecho, funciona perfecto, produce lo que necesito. Gracias. También estoy seguro de que hay una función de matriz lista para usar, lo intenté pero no pude obtener el resultado. Gracias de nuevo, usaré tu código. – tdecs

3

Puede utilizar array_udiff() y array_uintersect() con una función de comparación personalizada.

function cmp($a, $b) { 
    return $a['id'] - $b['id']; 
} 

$arr3 = array_udiff($arr1, $arr2, 'cmp'); 
$arr4 = array_uintersect($arr1, $arr2, 'cmp'); 

supongo que esto puede llegar a ser más lenta que la otra respuesta, ya que esto va a ir sobre las matrices de dos veces.

Cuestiones relacionadas