有如下数组,希望以为其中一维数组相同字段合并,并且total字段相加。例子如下
array(4) {
[0]=>
array(2) {
["total"]=>
string(1) "1"
["name"]=>
string(4) "张三"
}
[1]=>
array(2) {
["total"]=>
string(1) "1"
["name"]=>
string(4) "张三"
}
[2]=>
array(2) {
["total"]=>
string(1) "3"
["name"]=>
string(4) "张三"
}
[3]=>
array(2) {
["total"]=>
string(1) "1"
["name"]=>
string(6) "李四"
}
}
期望去重合并后得到新数组:
array(2) {
[0]=>
array(2) {
["total"]=>
string(1) "5"
["name"]=>
string(4) "张三"
}
[1]=>
array(2) {
["total"]=>
string(1) "1"
["name"]=>
string(6) "李四"
}
}
有谁有好的算法么
$arr = array(
array(
'id'=>'1',
'name' => '张三'
),
array(
'id'=>'2',
'name' => '张三'
),
array(
'id'=>'1',
'name' => '李四'
)
);
$item = array();
foreach($arr as $k=>$v){
if(!isset($item[$v['name']])){
$item[$v['name']]=$v;
}else{
$item[$v['name']]['id']+=$v['id'];
}
}
echo ‘
’;
print_r(array_values($item));
我觉得可以参考桶排序的原理
已经解出来了,3个循环搞定,虽然复杂一点,但是貌似也没有更好的办法
$newArr = array();
$arr2 = array_column($arr, 'name');
$arr2 = array_unique($arr2);
$arr2 = array_values($arr2);
$i = 0;
foreach($arr2 as $a)
{
$newArr[$i]['name'] = $a;
$i ++;
}
foreach($arr2 as $k => $v){
foreach($arr as $mk =>$mv){
if($mv['name'] == $v){
$newArr[$k]['total'] += $mv['total'];
}
}
}
我是这么做的,我觉得 @maxin[maxin] 方法是好的
能力有限,想不出好的算法,我也只能想到循环,但是觉得不应该是最好的。
说说的我的想法,(也许有这么个情况)我觉得这种数组应该是数据库设计不合理,或者思路上拐了个弯导致的问题。
为什么不能在在数据库设计的时候,把它设计的合理一点,或许说把sql语句写得合理一点,后期处理数据也许并不高效。
期待大神来一个厉害的算法,关注