最近想弄数据库“ID不同,NAME有重复”的记录合并,花费不少时间终于找到个满意的,代码虽都看的懂,但还是有不能理解的,比如:$data明明只包含在if语句之内,为什么还有有其它的数据?

话不多说,直接上干货:

        $param =  array(
            array (
                'hykno'         => '2222222-CB',
                'tcdk_fid'      => '458B6D70-FB7F-47AE-8356-777777777777',
                'totalamount'   => '0',
                'offsetamount'  => '90.0',
                'postamount'    => '0',
                'hysyamout'     => '10.0',
                'protypeid'     => '1',
            ),
            array (
                'hykno'         => '2222222-CB',
                'tcdk_fid'      => '458B6D70-FB7F-47AE-8356-777777777777',
                'totalamount'   => '0',           // 需要支付的钱
                'offsetamount'  => '5.0',        // 抵扣分类1下5.0份;
                'postamount'    => '0',            // 运费
                'hysyamout'     => '5.0',
                'protypeid'     => '1',
            ),
            array (
                'hykno'         => '2222222-CB',
                'tcdk_fid'      => '458B6D70-FB7F-47AE-8356-777777777777',
                'totalamount'   => '0',           // 需要支付的钱
                'offsetamount'  => '5.0',        // 抵扣分类1下5.0份;
                'postamount'    => '0',            // 运费
                'hysyamout'     => '5.0',
                'protypeid'     => '7',
            ),
            array (
                'hykno'         => '2222222-CB',
                'tcdk_fid'      => '458B6D70-FB7F-47AE-8356-777777777777',
                'totalamount'   => '0',           // 需要支付的钱
                'offsetamount'  => '5.0',        // 抵扣分类1下5.0份;
                'postamount'    => '0',            // 运费
                'hysyamout'     => '5.0',
                'protypeid'     => '3',
            )
        );

        $u = array();
        foreach ($param as $k => $v){
            if (!in_array($v['protypeid'],$u)){
                $u[] = $v['protypeid'];
            }
        }

        $data = array();
        foreach ($u as $uk => $uv)
        {
            foreach ($param as $pk => $pv)
            {
                if ($pv['protypeid'] == $uv)
                {
                    $data[$uv]['hykno'] = $pv['hykno'];
                    $data[$uv]['totalamount'] += $pv['totalamount'];
                    $data[$uv]['offsetamount'] += $pv['offsetamount'];
                    $data[$uv]['postamount'] += $pv['postamount'];
                    $data[$uv]['hysyamout'] += $pv['hysyamout'];
                    $data[$uv]['protypeid'] = $pv['protypeid'];
                }
            }
        }

        $data = array_values($data);

        print_r($data);

另一个版本:

        $param =  array(
            array (
                'hykno'         => '2222222-CB',
                'tcdk_fid'      => '458B6D70-FB7F-47AE-8356-777777777777',
                'totalamount'   => '0',
                'offsetamount'  => '90.0',
                'postamount'    => '0',
                'hysyamout'     => '10.0',
                'protypeid'     => '1',
            ),
            array (
                'hykno'         => '2222222-CB',
                'tcdk_fid'      => '458B6D70-FB7F-47AE-8356-777777777777',
                'totalamount'   => '0',           // 需要支付的钱
                'offsetamount'  => '5.0',        // 抵扣分类1下5.0份;
                'postamount'    => '0',            // 运费
                'hysyamout'     => '5.0',
                'protypeid'     => '1',
            ),
            array (
                'hykno'         => '2222222-CB',
                'tcdk_fid'      => '458B6D70-FB7F-47AE-8356-777777777777',
                'totalamount'   => '0',           // 需要支付的钱
                'offsetamount'  => '5.0',        // 抵扣分类1下5.0份;
                'postamount'    => '0',            // 运费
                'hysyamout'     => '5.0',
                'protypeid'     => '7',
            ),
            array (
                'hykno'         => '2222222-CB',
                'tcdk_fid'      => '458B6D70-FB7F-47AE-8356-777777777777',
                'totalamount'   => '0',           // 需要支付的钱
                'offsetamount'  => '5.0',        // 抵扣分类1下5.0份;
                'postamount'    => '0',            // 运费
                'hysyamout'     => '5.0',
                'protypeid'     => '3',
            )
        );

        $this->merger_by_one($param,'protypeid',['totalamount','offsetamount','postamount','hysyamout']);
    }


    /***
     * @param $param    需要处理统一格式的数组
     * @param $one_str  根据某个字段合并
     * @param $plus_arr 需要求和的字段列表数组
     */
    public function merger_by_one($param,$one_str,$plus_arr){
        $u = array();
        foreach ($param as $k => $v){
            if (!in_array($v[$one_str],$u)){
                $u[] = $v[$one_str];
            }
        }

        $data = array();
        foreach ($u as $uk => $uv)
        {
            foreach ($param as $pk => $pv)
            {
                $all_keys = array_keys($pv);
                if ($pv[$one_str] == $uv)
                {
                    foreach ($all_keys as $key_val)
                    {
                        if (in_array($key_val,$plus_arr)){
                            $data[$uv][$key_val] += $pv[$key_val];
                        } else {
                            $data[$uv][$key_val] = $pv[$key_val];
                        }
                    }
                }
            }
        }

        $data = array_values($data);

        print_($data);

附上PHP在线测试:https://c.runoob.com/compile/1

本文系转载:https://www.cnblogs.com/pansidong/p/10132483.html