
请问怎样合并period相同,并且price相同的数组?
合并前
$arr = array(
array("id"=>,'num'=>5,'period'=>3,'price'=>5),
array("id"=>2,'num'=>10,'period'=>3,'price'=>5),
array("id"=>3,'num'=>15,'period'=>9,'price'=>20),
);
合并后
$arr = array(
array('num'=>15,'period'=>3,'price'=>5),
array('num'=>15,'period'=>9,'price'=>20),
);
第一次发贴,多多见谅哈!
1 kmvan Apr 2, 2015 <?php $old = [ ["id"=>1,'num'=>5,'period'=>3,'price'=>5], ["id"=>2,'num'=>10,'period'=>3,'price'=>5], ["id"=>3,'num'=>15,'period'=>9,'price'=>20] ]; $new = []; foreach($old as $k => $v){ if(isset($new[$v['period']])){ $new[$v['period']]['num'] += $v['num']; }else{ unset($v['id']); $new[$v['period']] = $v; } } var_dump($new); ?> 输出耗时:0.00074601173400879ms |
2 tuoxie007 Apr 2, 2015 就三条数据,测耗时意义不大吧。。。 |
5 jinganchuqi OP @kmvan 谢谢,但是我要的是 合并period相同,并且price也相同的数组呀,您还能给我说说其他方法吗? |
6 kmvan Apr 2, 2015 @jinganchuqi 我要的是 合并period相同,并且price也相同的数组呀,您还能给我说说其他方法吗? 你的结果 price 也没有相同。 |
7 kmvan Apr 2, 2015 <?php $old = [ ["id"=>1,'num'=>5,'period'=>3,'price'=>5], ["id"=>2,'num'=>10,'period'=>3,'price'=>5], ["id"=>3,'num'=>15,'period'=>9,'price'=>20] ]; $new = []; foreach($old as $k => $v){ if(isset($new[$v['period']])){ $new[$v['period'] . $v['price']]['num'] += $v['num']; }else{ unset($v['id']); $new[$v['period'] . $v['price']] = $v; } } var_dump($new); //这样就ok了啊。isset的效率略高。 |
8 jinganchuqi OP @kmvan 好吧,对不起,是我表达不清楚 。 我的意思是 以period 和 price 都相同 来作为合并的条件。 |
9 jinganchuqi OP @kmvan 十分感谢您啦!!!! |
10 l1905 Apr 2, 2015 <?php $arr = array( array("id"=>1,'num'=>5,'period'=>3,'price'=>5), array("id"=>2,'num'=>10,'period'=>3,'price'=>5), array("id"=>3,'num'=>15,'period'=>9,'price'=>20), ); $result = array(); $check = array(); foreach ($arr as $k => $data) { $ser = serialize(array('period'=>$data['period'], 'price'=>$data['price'])); if(!in_array($ser, $check)) { array_push($check, $ser); $result[$ser] = array('num'=>$data['num'],'period'=>$data['period'], 'price'=>$data['price']); } else { $result[$ser]['num'] += $data['num']; } } var_dump(array_values($result)); ?> 实现效率不肿么高。。。 |
11 kn007 Apr 3, 2015 学习一下 |
12 mhycy Apr 3, 2015 |
15 Sinute Apr 3, 2015 https://gist.github.com/Sinute/f67544f3bbcabe8d126c @kmvan 试试 period=11, price=12和period=1, price=112 |
16 mhycy Apr 3, 2015 |
18 0x000 Apr 3, 2015 array_unique(array_merage(array_column($arr, 'period'), array_column($arr, 'price'))); 或者使用array_map,或者使用傻瓜式循环 |
19 kmvan Apr 3, 2015 我漏了一个地方 if(isset($new[$v['period']])){ 改成 if(isset($new[$v['period'] . $v['price']])){ |
20 msg7086 Apr 3, 2015 |