当前位置 博文首页 > fareast_mzh的博客:已经排序的 数组合并 元素

    fareast_mzh的博客:已经排序的 数组合并 元素

    作者:[db:作者] 时间:2021-08-13 15:57

    [{"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) { /* ... */});

    ?

    cs