【问题标题】:How can I group repeated values of a multidimensional associative array in php?如何在php中对多维关联数组的重复值进行分组?
【发布时间】:2018-04-25 04:40:17
【问题描述】:

像这样对数组的重复值进行分组的最佳方法是什么:

$array = [
        0 => ['id'=>1, 'name'=>'prod1', 'type'=>'a', 'price'=>2.50],
        1 => ['id'=>1, 'name'=>'prod1', 'type'=>'b', 'price'=>5.50],
        2 => ['id'=>1, 'name'=>'prod1', 'type'=>'c', 'price'=>10.50],
        3 => ['id'=>2, 'name'=>'prod2', 'type'=>'a', 'price'=>3.50],
        4 => ['id'=>2, 'name'=>'prod2', 'type'=>'b', 'price'=>7.50]
      ]; 

为了得到这样的输出数组:

$sorted_array = [
    0 => ['id'=>1, 'name'=>'prod1', 'type'=>['a' => ['price'=>2.50], 
                                             'b'=> ['price'=>5.50], 
                                             'c'=> ['price'=>10.50]
                                            ]
         ],
    1 => ['id'=>2, 'name'=>'prod2', 'type'=>['a'=>['price'=>3.50],
                                             'b'=>['price'=>7.50]
                                            ]
          ]

  ]; 

【问题讨论】:

  • 向我们展示您迄今为止的尝试。

标签: php arrays multidimensional-array associative-array


【解决方案1】:

这并不是完全最好的方法,但它可以满足你的需求:

$sorted_array = [];
for($i = 0; $i < count($array); $i++){
    $k = $array[$i]['id']-1;
    if($sorted_array[$k] == null){
        $sorted_array[$k]['id'] = $array[$i]['id'];
        $sorted_array[$k]['name'] = $array[$i]['name'];
    }
    $sorted_array[$k]['type'][$array[$i]['type']]['price'] = $array[$i]['price'];
}

我使用您的阵列在本地服务器上进行了测试,结果如下:

Array
(
[0] => Array
    (
        [id] => 1
        [name] => prod1
        [type] => Array
            (
                [a] => Array
                    (
                        [price] => 2.5
                    )

                [b] => Array
                    (
                        [price] => 5.5
                    )

                [c] => Array
                    (
                        [price] => 10.5
                    )

            )

    )

[1] => Array
    (
        [id] => 2
        [name] => prod2
        [type] => Array
            (
                [a] => Array
                    (
                        [price] => 3.5
                    )

                [b] => Array
                    (
                        [price] => 7.5
                    )

            )

    )

)

【讨论】:

    【解决方案2】:

    Zeke,我对你的方法稍作改动,因为编译器抱怨一些“未定义的偏移量”。

    现在是这样的:

    $sorted_array = [];
    
    for($i = 0; $i < count($array); $i++){
        if($i == 0){
            $sorted_array[$i]['id'] = $array[$i]['id'];
            $sorted_array[$i]['name'] = $array[$i]['name'];
            $sorted_array[$i]['type'][$array[$i]['type']]['price'] = $array[$i]['price'];
        }else{
             $last = end($sorted_array);
             $key = key($sorted_array);
             if($last['id']==$array[$i]['id']){
                 $sorted_array[$key]['type'][$array[$i]['type']]['price'] = $array[$i]['price'];
             }else{
                 $k = $key+1;
                 $sorted_array[$k]['id'] = $array[$i]['id'];
                 $sorted_array[$k]['name'] = $array[$i]['name'];
                 $sorted_array[$k]['type'][$array[$i]['type']]['price'] = $array[$i]['price'];
             }
        }
    }
    

    输出:

    Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => prod1
                [type] => Array
                    (
                        [a] => Array
                            (
                                [price] => 2.5
                            )
    
                        [b] => Array
                            (
                                [price] => 5.5
                            )
    
                        [c] => Array
                            (
                                [price] => 10.5
                            )
    
                    )
    
            )
    
        [1] => Array
            (
                [id] => 2
                [name] => prod2
                [type] => Array
                    (
                        [a] => Array
                            (
                                [price] => 3.5
                            )
    
                        [b] => Array
                            (
                                [price] => 7.5
                            )
    
                    )
    
            )
    
    )
    

    感谢一百万泽克,您的回答对我帮助很大。

    【讨论】:

    • 这也是另一种方式!很高兴我的回答对你有所帮助。如果您愿意,请将其标记为正确答案!我知道“未定义的偏移量”是什么,但出于回答的目的,我只是忽略了它们。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 2017-12-01
    • 2018-12-31
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多