dongyi5070 2015-08-24 16:56
浏览 64
已采纳

PHP合并多维数组

I have the following 3 multidimensional arrays:

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
        )

And I would like to combine them keeping the keys 'id_produto' and 'categoria' and have something like:

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
        )

I tried array_merge($array1,$array2,$array3) and array_merge_recursive($array1,$array2,$array3) but it does copy them into an array with 9 elements. The following code worked for me but I'm looking for a faster solution, because I have thousands of ids:

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'];
        }
    }
}
  • 写回答

3条回答 默认 最新

  • dongshui2254 2015-08-24 18:31
    关注

    First, why is your code slow? Assuming you have 1000 elements, your code is doing 1000*(1000+1000) = 2 millions iterations. That's why.

    How to make it faster? Use assoc arrays instead of normal arrays, i.e. use id_produto as the key, so you can have direct access to the right elements instead of having to do a loop inside a loop.

    To do that, first convert array2 and array3. Example with array2:

    $new_array2 = array();
    foreach ( $array2 as $row ) {
        $new_array2[$row['id_produto']] = $row;
    }
    $array2 = $new_array2;
    

    Then merge:

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

    Total : 3000 iterations only.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败