最近想弄数据库“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