请大家帮我看看,这个修改数组结构,有没有优雅的写法

原数据结构:

$a = [
        [
            [
                'N' => '1',
                'V' => 1.42,
            ],
            [
                'N' => '2',
                'V' => 4.5,
            ],
            [
                'N' => '3',
                'V' => 8.1,
            ],
        ],
        [
            [
                'N' => '1',
                'V' => 1.446,
            ],
            [
                'N' => '2',
                'V' => 4.34,
            ],
            [
                'N' => '3',
                'V' => 9.04,
            ],
        ],
        [
            [
                'N' => '1',
                'V' => 1.44,
            ],
            [
                'N' => '2',
                'V' => 4,
            ],
            [
                'N' => '3',
                'V' => 8,
            ],
        ],
    ];

预期得到的结构

$b = [
        [
            'N' => '1',
            'V' => 1.439,
        ],
        [
            'N' => '2',
            'V' => 4.26,
        ],
        [
            'N' => '3',
            'V' => 8.285,
        ],
    ];

描述:

数组层数少了一层,N为多个数组都一样,合并为一个。V是多个数组内V的平均值。
数组个数不定,每一层的数组个数都不定。
例如N可能有1,2,3,4,5,且可能需要求8个数的平均值
希望我描述清楚了:smile:

补充:
简单说就是$b 输出 $a[0]的结构,且$b 里的 V 是 $a 里的N相同的V的平均值

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

群里老哥给出了答案,自己稍微修改了一下,完美解决!性能无所谓,主要是可读性好了

    $c = collect($a)
        ->collapse()
        ->groupBy('N')
        ->map(fn($item, $key) => ['N' => $key, 'V' => $item->avg('V')])
        ->values()
        ->toArray();
2年前 评论
我爱大可乐 2年前
sunny123456 2年前
讨论数量: 5

自己写出来了,但是感觉很丑,想看看有没有大佬有好的写法

    $c=[];
    foreach ($a as $k => $v) {
        if ($k == 0) {
            $c = $v;
        } else {
            foreach ($v as $kk => $vv) {
                $c[$kk]['V'] = $vv['V'] + $c[$kk]['V'];
            }
        }
    }
    foreach ($c as $k => $v) {
        $c[$k]['V'] = $v['V'] / count($a);
    }
    dump($c);
2年前 评论
我爱大可乐 2年前

群里老哥给出了答案,自己稍微修改了一下,完美解决!性能无所谓,主要是可读性好了

    $c = collect($a)
        ->collapse()
        ->groupBy('N')
        ->map(fn($item, $key) => ['N' => $key, 'V' => $item->avg('V')])
        ->values()
        ->toArray();
2年前 评论
我爱大可乐 2年前
sunny123456 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!