我想在PHP中加入两个数组,就像我用MySQL join left
一样。我有两个数组:
$db_products
(它有id
和sku
个字段)$csv_prices
(包含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()
使用$csv_prices[$key]
来减少使用时间的10%,但我希望提高效率。
答案 0 :(得分:2)
如果循环遍历$csv_products
数组并将SKU设置为数组键,那么每次有新产品找到匹配项时,您都不必以指数方式遍历该数组。
相反,您只需遍历产品数组并使用isset()
查看它是否存在。
通过这种方式,您只需要执行1次count($db_products)
次和1次count($csv_prices)
次重复,而不是count($db_products) * count($csv_prices)
次重复次数(12,000次对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'] : '';
}
当然,在开始使用大型数据集之前,您不会看到性能上的显着差异 - 随着数据集的增长,这种变化会呈指数级变化。
答案 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;
}