php 二维数组去重合并的问题
怪我咯
怪我咯 2017-04-11 10:03:25
[PHP讨论组]

有如下数组,希望以为其中一维数组相同字段合并,并且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) "李四"
  }
}

有谁有好的算法么

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(5)
伊谢尔伦

$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 '<pre>';
print_r(array_values($item));

阿神

我觉得可以参考桶排序的原理

ringa_lee

已经解出来了,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] 方法是好的
PHP中文网

能力有限,想不出好的算法,我也只能想到循环,但是觉得不应该是最好的。
说说的我的想法,(也许有这么个情况)我觉得这种数组应该是数据库设计不合理,或者思路上拐了个弯导致的问题。
为什么不能在在数据库设计的时候,把它设计的合理一点,或许说把sql语句写得合理一点,后期处理数据也许并不高效。
期待大神来一个厉害的算法,关注

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号