2010-05-21 36 views
7

ho questo due array:Confrontare due array associativi e creare un nuovo array con gli array abbinati, 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) 
      ); 

Come posso "estrarre" matrici da $ arr1, dove id hanno lo stesso valore a $ arr2 , in un nuovo array e lasciare l'array estratto anche in un nuovo array, senza tenere conto degli ordini delle chiavi?

L'uscita Sto cercando dovrebbe essere:

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

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

Grazie

risposta

6

Sono sicuro che ci sono alcuni fatti funzioni di array magiche pronte in grado di gestire questo, ma ecco un esempio di base:

$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; 
    } 
} 

L'uscita sarà la stessa di quella desiderata. Live Esempio:

http://codepad.org/c4hOdnIa

+0

Effettivamente funziona perfettamente, emette ciò di cui ho bisogno. Grazie. Sono anche sicuro che c'è una funzione di array già pronta da usare, ho provato ma non ho potuto ottenere il risultato. Grazie ancora, userò il tuo codice. – tdecs

3

È possibile utilizzare array_udiff() e array_uintersect() con una funzione di confronto personalizzato.

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

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

Credo che questo può finire per essere più lento rispetto alla altra risposta, in quanto questo sarà andando oltre le matrici due volte.