在 PHP 中连接数组(如 MySQL 连接)
Joining arrays in PHP (like MySQL join)
我想在 PHP 中连接两个数组,就像我在 MySQL join left
中所做的一样。我有两个数组:
$db_products
来自数据库(它有 id
和 sku
字段)
来自 CSV 文件的 $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 检查匹配。非常耗费精力和时间,我想提高效率
我可以减少 10% 的使用时间,通过 unset()
-ing 使用的 $csv_prices[$key]
,但我想要更有效率。
如果您遍历 $csv_products
数组一次并将 SKU 设置为数组键,那么每次您有新产品时都不必以指数方式遍历该数组来找到它的匹配项。
相反,您只需遍历产品数组并使用 isset()
查看它是否存在。
这样你只需要重复 1 次 count($db_products)
和 1 次 count($csv_prices)
,而不是 count($db_products) * count($csv_prices)
次(12000 对 3200 万)。
这个概念可以被认为类似于数据库中的索引 - 你使用你想要查找的键作为数组 key/index,这意味着你不必每次都循环遍历数组找到你想要的记录。
// 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;
}
我想在 PHP 中连接两个数组,就像我在 MySQL join left
中所做的一样。我有两个数组:
$db_products
来自数据库(它有id
和sku
字段)
来自 CSV 文件的 $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 检查匹配。非常耗费精力和时间,我想提高效率
我可以减少 10% 的使用时间,通过 unset()
-ing 使用的 $csv_prices[$key]
,但我想要更有效率。
如果您遍历 $csv_products
数组一次并将 SKU 设置为数组键,那么每次您有新产品时都不必以指数方式遍历该数组来找到它的匹配项。
相反,您只需遍历产品数组并使用 isset()
查看它是否存在。
这样你只需要重复 1 次 count($db_products)
和 1 次 count($csv_prices)
,而不是 count($db_products) * count($csv_prices)
次(12000 对 3200 万)。
这个概念可以被认为类似于数据库中的索引 - 你使用你想要查找的键作为数组 key/index,这意味着你不必每次都循环遍历数组找到你想要的记录。
// 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;
}