已经排序的 数组合并 元素

[{"month":"2021-01-01","kpi":"3238"},{"month":"2021-02-01","kpi":"2726"},{"month":"2021-02-08","kpi":"2159"},{"month":"2021-03-01","kpi":"3026"},{"month":"2021-03-04","kpi":"1"},{"month":"2021-03-05","kpi":"2"},{"month":"2021-04-01","kpi":"2936"},{"month":"2021-05-01","kpi":"3118"},{"month":"2021-06-01","kpi":"3433"},{"month":"2021-07-01","kpi":"4163"},{"month":"2021-08-01","kpi":"4364"},{"month":"2021-09-01","kpi":"4520"},{"month":"2021-10-01","kpi":"5238"},{"month":"2021-11-01","kpi":"5554"},{"month":"2021-12-01","kpi":"5573"}]

需要把相同月份合并(已经按顺序排了),累加kpi,得到如下结果:

[{"month":"2021-01","kpi":"3238"},{"month":"2021-02","kpi":4885},{"month":"2021-03","kpi":3029},{"month":"2021-04","kpi":"2936"},{"month":"2021-05","kpi":"3118"},{"month":"2021-06","kpi":"3433"},{"month":"2021-07","kpi":"4163"},{"month":"2021-08","kpi":"4364"},{"month":"2021-09","kpi":"4520"},{"month":"2021-10","kpi":"5238"},{"month":"2021-11","kpi":"5554"},{"month":"2021-12","kpi":"5573"}]

    private static function mergeDupMonth($kpiList) {
        // merge
        $n = count($kpiList);

        $ans = array();

        $thisMonth = substr($kpiList[0]['month'], 0, 7);
        $ans[0] = array(
            'month' => $thisMonth,
            'kpi' => $kpiList[0]['kpi'],
        );

        $j = 0;
        for ($i = 1; $i < $n; $i += 1) {
            $lastMonth = $thisMonth;
            $thisMonth = substr($kpiList[$i]['month'], 0, 7);

            if (strncmp($thisMonth, $lastMonth, 7) == 0) {
                $ans[$j]['kpi'] += $kpiList[$i]['kpi'];
            } else {
                $j += 1;
                $ans[$j] = array(
                    'month' => $thisMonth,
                    'kpi' => $kpiList[$i]['kpi'],
                );
            }
        }
        return $ans;
    }

类似implode函数的实现,先处理第0个,再循环后面的

 

排序 usort($a, function($a, $b) { /* ... */});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fareast_mzh

打赏个金币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值