首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 高效合併兩個關聯陣列:模擬 SQL LEFT JOIN、下標索引法

     編輯:PHP 綜合知識

問題場景

兩個查詢結果需按 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'],
];

低效寫法:雙層迴圈 O(n×m)

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

高效寫法:建立下標索引 O(n+m)

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 )
)

關鍵點

  • 利用 PHP 陣列哈希表 O(1) 查找特性
  • array_merge 後者鍵值覆蓋前者(數值索引除外)
  • 模擬 LEFT JOIN:以第一個陣列為主表
  • 重複鍵在 $test2 中會被覆蓋,依業務決定是否保留陣列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved