2010-05-21 113 views
7

我有这两个数组:比较两个关联数组,并创建匹配的数组新阵列,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) 
      ); 

如何从$ ARR1,其中id在$ ARR2具有相同的价值“提取”阵列,转换成一个新的数组,并将提取的数组保留在一个新的数组中,而不考虑键顺序?

我找的输出应该是:

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

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

感谢

回答

6

我敢肯定有一个可以处理该些现成的魔法阵的功能,但这里有一个基本的例子:

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

输出将与您所希望的一样。活生生的例子:

http://codepad.org/c4hOdnIa

+0

确实,它的工作完美,输出我所需要的。谢谢。我也确信有一个现成的数组函数可以使用,我试过但无法得到结果。再次感谢您,我将使用您的代码。 – tdecs 2010-05-21 12:53:56

3

您可以使用array_udiff()array_uintersect()用自定义的比较函数。

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

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

我想这可能最终会比其他答案慢,因为这将通过两次数组。

相关问题