2017-02-10 82 views
2

我在合并数组时遇到问题,不知道我在做什么错误。请看下面的代码:将2个关联数组合并为1

$array1 = [ 
    [ 'job' => '123', 'who' => 'Alpha' ], 
    [ 'job' => '789', 'who' => 'Bravo' ] 
]; 

$array2 = [ 
    [ 'job' => '123', 'when' => 'Today' ] 
]; 

$desiredArray = [ 
    [ 'job' => '123', 'who' => 'Alpha', 'when' => 'Today' ], 
    [ 'job' => '789', 'who' => 'Bravo', 'when' => '' ] 
]; 

这是我一直在努力做的事情:

$newArray = []; 

foreach ($array2 as $row) { 
    foreach ($array1 as $record) { 
     if ($row['job'] === $record['job']) { 
      $tempArray = [ 
       'when' => $row['when'] 
      ]; 
      $newRecord = array_merge($record, $tempArray); 
      array_push($newArray, $newRecord); 
     }; 
    }; 
}; 

这有点儿工作,但问题是当有不匹配,它仍然需要把原始记录放入我的新数组中。我试图在if语句之外添加一些内容,但是我的循环被卡住了。任何帮助表示赞赏。

回答

4

如果您提取的数组为job作为密钥,则更容易。第二只是循环的第一阵列和检查相同的密钥和合并:

$a1 = array_column($array1, null, 'job'); 
$a2 = array_column($array2, null, 'job'); 

foreach($a1 as $key => $val) { 
    $result[] = isset($a2[$key]) ? $val + $a2[$key] : $val; 
} 

或者同一个内置:

$result = array_replace_recursive(array_column($array1, null, 'job'), 
            array_column($array2, null, 'job')); 

如果您需要重新索引来自:

$result = array_values($result); 
+1

这是迄今为止最好的答案! – Kitson88

+1

最佳答案,它需要的所有内容都是用'array_replace_recursive($ a1,$ a2)' –

+1

@Ayaou替换循环:好主意!我如何给你奖励? – AbraCadaver

2

从2个数组中的一个开始并与另一个数组合并。标志有什么不发现:

$newArray = $array1; 

foreach ($array2 as $row) { //You need to eventually deal with all of these somehow 
    $found = false; 
    foreach ($newArray as $key => $record) { 
     if ($row['job'] === $record['job']) { 
      $found = true; 
      $newArray[$key] += $row; //Merge if found 
     } 
    } 
    if (!$found) { 
     $newArray[] = $row; //Append if not found 
    } 
} 
+1

过于复杂,但它的工作原理 – RiggsFolly

3

我想你颠倒了循环,我还增加了$exist变量,以检查是否从$array1项目不$array2存在(这样我就可以将其添加)

foreach ($array1 as $row) { 
     $exists = false; 
     foreach ($array2 as $record) { 
      if ($row['job'] === $record['job']) { 
       $tempArray = [ 
        'when' => $record['when'] 
       ]; 
       $newRecord = array_merge($row, $tempArray); 
       array_push($newArray, $newRecord); 
       $exists =true; 
      }; 
     }; 
     if(!$exists){ 
      array_push($newArray, $row);  
     } 
    }; 
+1

过于复杂,但它的工作原理 – RiggsFolly

+3

另外这个假设'when'是唯一的新的关键,不是很可扩展性。 – AbraCadaver

+1

我喜欢这个答案,因为这是我试图采取的方法,并且您向我展示了我需要的缺失部分,但是我将测试其他答案以查看真正最好的答案。如果其他人不能平息,我会将此标记为答案。 – Slime

0

您可以在array1中添加when键,您可以按照这种方式进行操作。

$jobs_time = array_combine(array_column($array2, 'job'), array_column($array2, 'when')); 
$result = array_map(function($v)use($jobs_time){ 
    $v['when'] = isset($jobs_time[$v['job']]) ? $jobs_time[$v['job']] : ''; 
    return $v; 
}, $array1);