我想在 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%的使用时间,但我想更有效率。
如果您循环遍历
$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'] : '';
}
当然,在开始使用大型数据集之前,您不会看到性能上的显着差异——随着数据集的增长,这种变化会呈指数级增长。
对我来说很好用
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;
}