请问 php 中怎样合并二维数组相同的 key?

2015-04-02 18:33:23 +08:00
 jinganchuqi

请问怎样合并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),
);
第一次发贴,多多见谅哈!

4471 次点击
所在节点    PHP
20 条回复
kmvan
2015-04-02 19:12:56 +08:00
<?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
tuoxie007
2015-04-02 19:23:23 +08:00
就三条数据,测耗时意义不大吧。。。
tuoxie007
2015-04-02 19:23:37 +08:00
@kmvan 就三条数据,测耗时意义不大吧。。。
kmvan
2015-04-02 19:37:03 +08:00
@tuoxie007 就三条数据,测耗时意义不大吧。。。
你一定是妒忌我和我的头像
jinganchuqi
2015-04-02 19:40:12 +08:00
@kmvan 谢谢,但是我要的是 合并period相同,并且price也相同的数组呀,您还能给我说说其他方法吗?
kmvan
2015-04-02 19:56:37 +08:00
@jinganchuqi 我要的是 合并period相同,并且price也相同的数组呀,您还能给我说说其他方法吗?
你的结果 price 也没有相同。
kmvan
2015-04-02 19:59:19 +08:00
<?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的效率略高。
jinganchuqi
2015-04-02 20:02:52 +08:00
@kmvan 好吧,对不起,是我表达不清楚 。 我的意思是 以period 和 price 都相同 来作为合并的条件。
jinganchuqi
2015-04-02 20:05:30 +08:00
@kmvan 十分感谢您啦!!!!
l1905
2015-04-02 20:20:51 +08:00
<?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));

?>
实现效率不肿么高。。。
kn007
2015-04-03 00:17:59 +08:00
学习一下
mhycy
2015-04-03 01:01:27 +08:00
mhycy
2015-04-03 01:02:51 +08:00
@kmvan 之前那个写法不怕period和price连在一起出问题么?都是数字。。。
kmvan
2015-04-03 01:17:57 +08:00
@mhycy 之前那个写法不怕period和price连在一起出问题么?都是数字。。。
显然不会。而且最高效,跑10w次1ms都不用
Sinute
2015-04-03 01:27:07 +08:00
https://gist.github.com/Sinute/f67544f3bbcabe8d126c

@kmvan
试试 period=11, price=12和period=1, price=112
mhycy
2015-04-03 01:29:21 +08:00
mhycy
2015-04-03 01:35:11 +08:00
@Sinute
好高端的写法。。。
else没有花括号不能忍。。
0x000
2015-04-03 10:01:19 +08:00
array_unique(array_merage(array_column($arr, 'period'), array_column($arr, 'price')));

或者使用array_map,或者使用傻瓜式循环
kmvan
2015-04-03 10:10:32 +08:00
我漏了一个地方
if(isset($new[$v['period']])){
改成
if(isset($new[$v['period'] . $v['price']])){
msg7086
2015-04-03 17:22:41 +08:00
@kmvan 最好把key单独赋值,不容易出错。

https://gist.github.com/msg7086/01761d72e1d8c2cf12ae

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181180

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX