2012-12-02 24 views
9

合并两个多维数组比方说,我有以下阵列:特定的键

Array 
    (
     [0] => Array 
      (
       [id] => 5 
       [name] => Education 
      ) 

     [1] => Array 
      (
       [id] => 4 
       [name] => Computers 
      ) 

     [3] => Array 
      (
       [id] => 7 
       [name] => Science 

     [4] => Array 
      (
       [id] => 1 
       [name] => Sports 
      ) 
    ) 

,第二个:

Array 
    (
     [0] => Array 
      (
       [id] => 1 
       [title] => Sport 
      ) 

     [1] => Array 
      (
       [id] => 7 
       [title] => Sci 
      ) 

     [3] => Array 
      (
       [id] => 4 
       [title] => Comp 

     [4] => Array 
      (
       [id] => 5 
       [title] => Edu 
      ) 
    ) 

和期望的输出是:

Array 
    (
     [0] => Array 
      (
       [id] => 5 
       [name] => Education 
       [title] => Edu 
      ) 

     [1] => Array 
      (
       [id] => 4 
       [name] => Computers 
       [title] => Comp 
      ) 

     [3] => Array 
      (
       [id] => 7 
       [name] => Science 
       [title] => Sci 

     [4] => Array 
      (
       [id] => 1 
       [name] => Sports 
       [title] => Sport 
      ) 
    ) 

我有设法合并这些阵列:

foreach($first as $key => $value){ 
    $result[$key] = array_merge($first[$key], $second[$key]); 
} 

但输出不正确组合:

Array 
    (
     [0] => Array 
      (
       [id] => 5 
       [name] => Education 
       [title] => Sport 
      ) 

     [1] => Array 
      (
       [id] => 4 
       [name] => Computers 
       [title] => Sci 
      ) 

     [3] => Array 
      (
       [id] => 7 
       [name] => Science 
       [title] => Comp 

     [4] => Array 
      (
       [id] => 1 
       [name] => Sports 
       [title] => Edu 
      ) 
    ) 

的问题是,我想在同一id合并这些阵列。 所需的输出排序应该与第一个数组中的相同。

我该如何做到这一点?任何帮助深表感谢。

回答

8

你可以做一个嵌套循环并检查id值是否匹配,然后将title添加到$first(或name$second

foreach($first as $key => $value){ 
    foreach($second as $value2){ 
     if($value['id'] === $value2['id']){ 
      $first[$key]['title'] = $value2['title']; 
     }    
    } 
} 
+0

这是什么时间复杂度?为O(n^2)?这绝对可以做得更好。 – velop

2

你的代码工作正常。你的期望不正确。例如,在一个阵列4元id持有1,但在另一个数组,第4单元id是5,那么你“同一ID合并这些阵列”是没有意义的,通过合并四元素融入其中,你也合并他们的孩子,并且由于id在两个数组中都使用,所以一旦数值必须消失,因为数组中不能有两个相等的键。

编辑

你必须手动合并为PHP函数撤并基于,而你要根据内容合并:

$result = array(); 
foreach($arrayA as $keyA => $valA) { 
    foreach($arrayB as $keyB => $valB) { 
    if($valA['id'] == $valB['id']) { 
     $result[$keyA] = $valA + $valB; 

     // or if you do not care output keys, just 
     // $result[] = $valA + $valB; 
    } 
    } 
} 
+0

我已经纠正了在输出一些失误,遗憾的是。我要的是采取如'$第[0] [ '身份证']'(等于'5')找到第二阵列中同'id',这里'$第二[4] [ '身份证']'和合并他们到这样的新数组:'array('id'=> 5,'name'=>'Education','title'=>'Edu')'。这不可能吗? – user1292810

+0

查看编辑答案 –

+0

工程就像一个魅力,谢谢:)并抱歉误导标题。 – user1292810

1

只要这两个数组总是拥有它们中的每个id,那么通过'id'字段对两个数组进行排序,然后让php进行合并?

function cmp($a, $b) { 
    return ((int) $a['id'] < (int) $b['id']) ? -1 : 1; 
} 

usort($array1, 'cmp'); 
usort($array2, 'cmp'); 

$result = array_merge($array1, $array2); 

未测试代码,但它证明了这个想法。

1

不要在foreach中使用foreach,当数组这么大时可能太慢。

$idArray = array_column($secondArray,'title','id'); 
foreach($firstArray as $key => $val){ 
    $firstArray[$key]['title'] = (isset($idArray[$val['id']]) ? $idArray[$val['title'] : 'some title'; 
} 
0

确保项目按相同的顺序,那么:

$items = array_map(function($itemFirstArray, $itemSecondArray) { 
    return array_merge($itemFirstArray, $itemSecondArray); 
}, $firstArray, $secondArray);