亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較兩個多維和關聯數組并獲得差異

比較兩個多維和關聯數組并獲得差異

PHP
臨摹微笑 2022-07-22 18:44:51
我需要像這樣比較兩個數組// currently in our database$firstArr = array(        ["id"=>1, "another_id"=>1],        ["id"=>2, "another_id"=>4],        ["id"=>5, "another_id"=>9]);// currently fetched from csv-files$secondArr = array(        ["id"=>6, "another_id"=>3],        ["id"=>2, "another_id"=>7],        ["id"=>1, "another_id"=>1]);第一個數組表示當前在我們數據庫中的數據,同時第二個表示從csv-file 傳遞的數據。為了不從數據庫中刪除整個數據,我需要比較兩個數組。如果csv-file 提供了不在數據庫中的數據,我想輸入這些數據集。如果數據庫包含不在csv-file 中的數據,我想將它們從數據庫中刪除。我想出了一個適用于數組中少量數據的解決方案:$new_to_database = array();foreach($secondArr AS $arr){    $in_database = array_filter(array_map(function($el) use ($arr){        if($el['id'] == $arr['id'] && $el['another_id'] == $arr['another_id']){            return $el;        }    }, $firstArr));    if(count($in_database) === 0){        $new_to_database[] = $arr;    }               }var_dump($new_to_database);   // input later on// array(2) { [0]=> array(2) { ["id"]=> int(6) ["another_id"]=> int(3) } [1]=> array(2) { ["id"]=> int(2) ["another_id"]=> int(7) } }問題是每個數組包含大約 5000 個數據集。結果腳本需要很長時間,并且我收到超過 360 秒的執行時間的錯誤。我該如何解決這個問題?我想算法應該更有效。
查看完整描述

2 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

您可以通過索引每個數組,id然后計算鍵的差異:


// Get items that are in CSV but not in database

$new = array_diff_key(array_column($csv, null, 'id'), array_column($db, null, 'id'));


// Get items that are in database but not in CSV

$del = array_diff_key(array_column($db, null, 'id'), array_column($csv, null, 'id'));

這是一個使用兩個簡單數組的演示,每個數組包含 50,000 個項目。


這很簡短,但您可能不想array_column多次運行:


$csv = array_column($csv, null, 'id');

$db  = array_column($db, null, 'id');


// Get items that are in CSV but not in database

$new = array_diff_key($csv, $db);


// Get items that are in database but not in CSV

$del = array_diff_key($db, $csv);

要比較整個數組內容(如果您添加的不僅僅是idand ,這將起作用another_id),您可以將每個數組映射并序列化為字符串表示形式并進行比較。請注意,元素的順序也很重要:


// Get items that are in CSV but not in database

$new = array_map('unserialize',

                 array_diff(array_map('serialize', $csv), array_map('serialize', $db)));


// Get items that are in database but not in CSV        

$del = array_map('unserialize',

                 array_diff(array_map('serialize', $db), array_map('serialize', $csv)));

在 DEMO 站點上,這個適用于 40,000 個數組項,但不是 50,000 個。這將取決于您的資源和php.ini設置。


如果您想查看每個數組中的相同內容,還有一個array_intersect_keyarray_intersect 。


查看完整回答
反對 回復 2022-07-22
?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

你正在做很多循環。foreach,array_filter并array_map使用大量時間。


$new_to_database = array_udiff($secondArr, $firstArr, function ($s, $f) {

    if ($s['id'] == $f['id'] && $s['another_id'] == $f['another_id']) {

        return 0;

    } else {

        return -1;

    }

});

這以更少的迭代提供了您需要的結果。


查看完整回答
反對 回復 2022-07-22
  • 2 回答
  • 0 關注
  • 124 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號