在 PHP 中连接数组(如 MySQL 连接)

问题描述 投票:0回答:2

我想在 PHP 中加入两个数组,就像我在 MySQL 中所做的一样

join left
。我有两个数组:

  • $db_products
    来自数据库(它有
    id
    sku
    字段)
  • $csv_prices
    来自 CSV 文件(它有
    sku
    price
    字段)

$db_products
:(它有 4000 个项目)

Array
(
    [0] => Array
        (
            [id] => 1012
            [sku] => asd123
    )
    [N] => Array
    (
            [id] => ...
            [sku] => ...
    )
)

$csv_prices
:(它有 8000 个项目)

Array
(
    [0] => Array
        (
            [sku] => asd123
            [price] => 15.50
    )
    [N] => Array
    (
            [sku] => ...
            [price] => ...
    )
)

连接是

$db_products[$key][sku] = $csv_prices[$key][sku]
。为了找到匹配对,我在循环中进行循环,这导致 4000 * 8000 检查匹配。非常耗费精力和时间,我要效率更高

我可以通过

unset()
-ing使用过的
$csv_prices[$key]
减少10%的使用时间,但我想更有效率。

php arrays database csv left-join
2个回答
4
投票

如果您循环遍历

$csv_products
数组一次并将SKU设置为数组键,那么每次有新产品找到它的匹配项时,您都不必以指数方式循环遍历该数组。

相反,您只需循环遍历产品数组并使用

isset()
来查看它是否存在。

这样你只需要做 1x

count($db_products)
和 1x
count($csv_prices)
重复,而不是
count($db_products) * count($csv_prices)
重复(12000 对 3200 万)。

这个概念可以被认为类似于数据库中的索引——你使用你想要查找的键作为数组键/索引,这意味着你不必每次都遍历数组来找到你想要的记录。

例子:

// Reindex the CSV array to use SKU as the key
$reindexed = array();
foreach ($csv_prices as $values) {
    $reindexed[$values['sku']] = $values;
}
unset($csv_prices);

// Join the prices
foreach ($db_products as &$product) {
    $sku = $product['sku'];
    $product['price'] = isset($reindexed[$sku]) ? $reindexed[$sku]['price'] : '';
}

当然,在开始使用大型数据集之前,您不会看到性能上的显着差异——随着数据集的增长,这种变化会呈指数级增长。


0
投票

对我来说很好用

function left_join_arrays($key, $array1, $array2) {
    
    $i=0;
    foreach ($array1 as $arr1) {
        foreach ($array2 as $arr2) {
            if ($arr1[$key]==$arr2[$key]) {
                foreach(array_keys($arr2) as $key2){
                    if ($key != $key2) {
                        $array1[$i][$key2]=$arr2[$key2];
                    }
                }
                continue;
            }
        }
        $i++;
    }

    return $array1;
}
© www.soinside.com 2019 - 2024. All rights reserved.