合并多个多维数组并按id列分组
我有以下3个多维数组:
Array
(
[0] => Array
(
[id_produto] => 191
[categoria] => 7
[prazo] => 8
[desconto] => 45
)
[1] => Array
(
[id_produto] => 194
[categoria] => 7
[prazo] => 8
[desconto] => 39
)
[2] => Array
(
[id_produto] => 195
[categoria] => 7
[prazo] => 8
[desconto] => 39
)
Array
(
[0] => Array
(
[id_produto] => 191
[categoria] => 7
[pageviews] => 2103
)
[1] => Array
(
[id_produto] => 194
[categoria] => 7
[pageviews] => 2445
)
[2] => Array
(
[id_produto] => 195
[categoria] => 7
[pageviews] => 1560
)
Array
(
[0] => Array
(
[id_produto] => 191
[categoria] => 7
[pedidos] => 3
[valor] => 6501.583023
)
[1] => Array
(
[id_produto] => 194
[categoria] => 7
[pedidos] => 1
[valor] => 2217.968420
)
[2] => Array
(
[id_produto] => 197
[categoria] => 7
[pedidos] => 2
[valor] => 4405.517706
)
我想将它们组合在一起,保留关键字‘id_produto’和‘categia’,并具有如下内容:
Array
(
[0] => Array
(
[id_produto] => 191
[categoria] => 7
[prazo] => 8
[desconto] => 45
[pageviews] => 2103
[pedidos] => 3
[valor] => 6501.583023
)
[1] => Array
(
[id_produto] => 194
[categoria] => 7
[prazo] => 8
[desconto] => 39
[pageviews] => 2445
[pedidos] => 1
[valor] => 2217.968420
)
[2] => Array
(
[id_produto] => 195
[categoria] => 7
[prazo] => 8
[desconto] => 39
[pageviews] => 1560
[pedidos] => 2
[valor] => 4405.517706
)
我尝试了array_merge($array1,$array2,$array3)
和array_merge_recursive($array1,$array2,$array3)
,但它确实将它们复制到包含9个元素的数组中。以下代码适用于我,但我正在寻找更快的解决方案,因为我有数千个ID:
foreach($array1 as $arr1=>$a){
foreach($array2 as $arr2=>$b){
if($a['id_produto'] == $b['id_produto']){
$array1[$arr1]['pageviews'] = $b['pageviews'];
}
}
foreach($array3 as $arr3=>$c){
if($a['id_produto'] == $c['id_produto']){
$array1[$arr1]['pedidos'] = $c['pedidos'];
$array1[$arr1]['valor'] = $c['valor'];
}
}
}
解决方案
首先,为什么您的代码很慢?假设您有1000个元素,您的代码将进行1000*(1000+1000)=200万次迭代。这就是为什么。
如何使其更快?使用ASSOC数组而不是普通数组,即使用id_produto
作为键,这样您就可以直接访问正确的元素,而不必在循环内执行循环。
为此,首先转换array2和array3。array2示例:
$new_array2 = array();
foreach ( $array2 as $row ) {
$new_array2[$row['id_produto']] = $row;
}
$array2 = $new_array2;
然后合并:
foreach ( $array1 as & $row ) {
$row['pageviews'] = $array2[$row['id_produto']['pageviews']];
$row['pedidos'] = $array3[$row['id_produto']['pedidos']];
$row['valor'] = $array3[$row['id_produto']['valor']];
}
总计:仅3000次迭代。
相关文章