用PHP连接数组(如MySQL连接)

时间:2015-04-14 00:57:34

标签: php arrays database csv left-join

我想在PHP中加入两个数组,就像我用MySQL join left一样。我有两个数组:

    来自数据库的
  • $db_products(它有idsku个字段)
  • CSV文件中的
  • $csv_prices(包含skuprice个字段)

$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()使用$csv_prices[$key]来减少使用时间的10%,但我希望提高效率。

2 个答案:

答案 0 :(得分:2)

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

相反,您只需遍历产品数组并使用isset()查看它是否存在。

通过这种方式,您只需要执行1次count($db_products)次和1次count($csv_prices)次重复,而不是count($db_products) * count($csv_prices)次重复次数(12,000次对3200万次)。

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

Example:

// 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'] : '';
}

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

答案 1 :(得分: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;
}