我在合并阵列时遇到问题,不知道自己做错了什么。请考虑以下代码:
$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语句之外,但是我的循环卡住了。任何帮助表示赞赏。
答案 0 :(得分: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 :(得分: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);
}
};
答案 2 :(得分: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
}
}
答案 3 :(得分: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);