请问怎样合并period相同,并且price相同的数组?
合并前
$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),
);
合并后
$arr = array(
array('num'=>15,'period'=>3,'price'=>5),
array('num'=>15,'period'=>9,'price'=>20),
);
第一次发贴,多多见谅哈!
1
kmvan 2015-04-02 19:12:56 +08:00 1
<?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 2015-04-02 19:23:23 +08:00
就三条数据,测耗时意义不大吧。。。
|
5
jinganchuqi OP @kmvan 谢谢,但是我要的是 合并period相同,并且price也相同的数组呀,您还能给我说说其他方法吗?
|
6
kmvan 2015-04-02 19:56:37 +08:00
@jinganchuqi 我要的是 合并period相同,并且price也相同的数组呀,您还能给我说说其他方法吗?
你的结果 price 也没有相同。 |
7
kmvan 2015-04-02 19:59:19 +08:00 1
<?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 2015-04-02 20:20:51 +08:00 1
<?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 2015-04-03 00:17:59 +08:00
学习一下
|
12
mhycy 2015-04-03 01:01:27 +08:00
|
14
kmvan 2015-04-03 01:17:57 +08:00 via Android
@mhycy 之前那个写法不怕period和price连在一起出问题么?都是数字。。。
显然不会。而且最高效,跑10w次1ms都不用 |
15
Sinute 2015-04-03 01:27:07 +08:00
https://gist.github.com/Sinute/f67544f3bbcabe8d126c
@kmvan 试试 period=11, price=12和period=1, price=112 |
16
mhycy 2015-04-03 01:29:21 +08:00
|
18
0x000 2015-04-03 10:01:19 +08:00
array_unique(array_merage(array_column($arr, 'period'), array_column($arr, 'price')));
或者使用array_map,或者使用傻瓜式循环 |
19
kmvan 2015-04-03 10:10:32 +08:00
我漏了一个地方
if(isset($new[$v['period']])){ 改成 if(isset($new[$v['period'] . $v['price']])){ |
20
msg7086 2015-04-03 17:22:41 +08:00
|