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

原数据结构:

$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的平均值

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

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

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

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

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

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