兩個查詢結果需按 id 關聯合併(類似 LEFT JOIN):
$test1 = [
['id' => 9478137, 'create_time' => 1394760724],
['id' => 9478138, 'create_time' => 1394760725],
['id' => 9478138, 'create_time' => 1394760725], // 重複 id
];
$test2 = [
['id' => 9478137, 'message' => 'love you'],
['id' => 9478138, 'message' => 'miss you'],
];
function merge_nested($a1, $a2, $f1, $f2) {
$ret = [];
foreach ($a1 as $v1) {
foreach ($a2 as $v2) {
if ($v1[$f1] == $v2[$f2]) {
$ret[] = array_merge($v1, $v2);
}
}
}
return $ret;
}
function merge_indexed($a1, $a2, $f1, $f2 = '') {
$f2 = $f2 ?: $f1;
$index = [];
// 建立第二個陣列的索引
foreach ($a2 as $v) {
$index[$v[$f2]] = $v; // 相同鍵後者覆蓋
}
// 遍歷第一個陣列合併
$ret = [];
foreach ($a1 as $v) {
$key = $v[$f1];
$ret[] = array_merge($index[$key] ?? [], $v);
}
return $ret;
}
$ret = merge_indexed($test1, $test2, 'id', 'id');
print_r($ret);
Array
(
[0] => Array ( [id] => 9478137 [message] => love you [create_time] => 1394760724 )
[1] => Array ( [id] => 9478138 [message] => miss you [create_time] => 1394760725 )
[2] => Array ( [id] => 9478138 [message] => miss you [create_time] => 1394760725 )
)
array_merge 後者鍵值覆蓋前者(數值索引除外)