bbs.thinkzhu.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5126|回复: 1
打印 上一主题 下一主题

PHP合并二维数组相同的key

[复制链接]

170

主题

267

帖子

1543

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1543
跳转到指定楼层
楼主
发表于 2014-4-24 11:25:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有如下二维数组:
1
2
3
4
5
$items= array(
    array('num'=>5,'period'=>3),
    array('num'=>10,'period'=>3),
    array('num'=>15,'period'=>9)
);

对period相同的值的数组,对num求和,怎么处理变成:
1
2
3
4
$items= array(
    array('num'=>15,'period'=>3),
    array('num'=>15,'period'=>9)
);


170

主题

267

帖子

1543

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1543
沙发
 楼主| 发表于 2014-4-24 11:25:42 | 只看该作者
hello__lemon的解法采用了key_exists 和重新建立新数组的方式,这个方式是处理此类数组问题的通用解决办法,值得大家参考。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$arr1 = array(
array('num'=>5,'period'=>3),
array('num'=>10,'period'=>3),
array('num'=>15,'period'=>9),
array('num'=>15,'period'=>7),
array('num'=>22,'period'=>3),
array('num'=>22,'period'=>9),
);

$arr2 = array();
foreach($arr1 as $k=>$v){
if(!key_exists($v['period'],$arr2)){
  $arr2[$v['period']] = $v['num'];
} else {
   $arr2[$v['period']] += $v['num'];
}
}
$arr3 = array();
foreach($arr2 as $k=>$v){
   $arr3[] = array('sum'=>$v,'period'=>$k);
}

print_r($arr3);

asun的解法巧妙的用了sort这个函数,比上一个解法更节省代码!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$data = array();
foreach ($items as $key=>$value)
{
if (array_key_exists($value['period'], $data))
{
    $data[$value['period']]['num'] += $value['num'];
}
else
{
    $data[$value['period']] = array('num'=>$value['num'],'period'=>$value['period']);
}
}
sort($data);

var_dump($data);

TNT的解法和hello__lemon的解法类似,不同的是用了isset判断数组的元素是否存在,那么抛出个问题,isset 和 key_exists 有什么差异,有人知道吗?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$items= array(
array('num'=>5,'period'=>3),
array('num'=>10,'period'=>3),
array('num'=>15,'period'=>9)
);
$new_items = array();
foreach($items as $key=>$item){
if(isset($new_items[$item['period']])){
  $new_items[$item['period']] += $item['num'];
}else{
  $new_items[$item['period']] = $item['num'];
}
}
$newItems = array();
$i = 0;
foreach($new_items as $key=>$new_item){
  $newItems[$i]['num'] = $new_item;
  $newItems[$i]['period'] = $key;
  $i++;
}
var_dump($newItems);
exit;


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|bbs.thinkzhu.com ( 京ICP备14043241号 )

Powered by Discuz! X3.4 © 2001-2012 Comsenz Inc.

GMT+8, 2019-12-24 18:34 , Processed in 0.051511 second(s), 20 queries .

快速回复 返回顶部 返回列表