求合并数组的高效方法

ohmygirl 2011-08-30 04:38:59

//原始的数组如下:
$test=array(
'titan'=>array(0=>array('date'=>'2011-08-11','DAU'=>'222','DNU'=>'111','DNUF'=>'444'),
1=>array('date'=>'2011-08-12','DAU'=>'333','DNU'=>'222','DNUF'=>'333'),
2=>array('date'=>'2011-08-13','DAU'=>'444','DNU'=>'333','DNUF'=>'555')),
'apollo'=>array(0=>array('date'=>'2011-08-11','DAU'=>'298','DNU'=>'290','DNUF'=>'900'),
1=>array('date'=>'2011-08-12','DAU'=>'340','DNU'=>'490','DNUF'=>'599'),
2=>array('date'=>'2011-08-13','DAU'=>'234','DNU'=>'345','DNUF'=>'532')),
'bossvegas'=>array(0=>array('date'=>'2011-08-11','DAU'=>'343','DNU'=>'532','DNUF'=>'342'),
1=>array('date'=>'2011-08-12','DAU'=>'323','DNU'=>'234','DNUF'=>'521'),
2=>array('date'=>'2011-08-13','DAU'=>'342','DNU'=>'342','DNUF'=>'523')),
'fishbowl'=>array(0=>array('date'=>'2011-08-11','DAU'=>'342','DNU'=>'523','DNUF'=>'522'),
1=>array('date'=>'2011-08-12','DAU'=>'333','DNU'=>'324','DNUF'=>'555'),
2=>array('date'=>'2011-08-13','DAU'=>'943','DNU'=>'533','DNUF'=>'666')),
);


//需要合并成如下的形式:
$resultArray=array(
0=>array(0=>array('date'=>'2011-08-11','DAU-titan'=>'222','DAU-apollo'=>'298','DAU-bossvegas'=>'','DAU-fishbowl'=>''),
1=>array('date'=>'2011-08-12','DAU-titan'=>'','DAU-apollo'=>'','DAU-bossvegas'=>'','DNU-fishbowl'=>''),
2=>array('date'=>'2011-08-13','DAU-titan'=>'','DAU-apollo'=>'','DAU-bossvegas'=>'','DAU-fishbowl'=>'')),

1=>array(0=>array('date'=>'2011-08-11','DNU-titan'=>'111','DNU-apollo'=>'290','DNU-bossvegas'=>'','DNU-fishbowl'=>''),
1=>array('date'=>'2011-08-12','DNU-titan'=>'','DNU-apollo'=>'','DNU-bossvegas'=>'','DNU-fishbowl'=>''),
2=>array('date'=>'2011-08-13','DNU-titan'=>'','DNU-apollo'=>'','DNU-bossvegas'=>'','DNU-fishbowl'=>'')),

2=>array(0=>array('date'=>'2011-08-11','DNUF-titan'=>'444','DNUF-apollo'=>'900','DAUF-bossvegas'=>'','DNUF-fishbowl'=>''),
1=>array('date'=>'2011-08-12','DNUF-titan'=>'','DNUF-apollo'=>'','DAUF-bossvegas'=>'','DNUF-fishbowl'=>''),
2=>array('date'=>'2011-08-13','DNUF-titan'=>'','DNUF-apollo'=>'','DAUF-bossvegas'=>'','DAUF-fishbowl'=>''))
);


求合并数组的高效方法。
...全文
146 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ohmygirl 2011-08-31
  • 打赏
  • 举报
回复
解决:
  $gamelist=array(0=>array('date','DAU-apollo','DAU-bossvegas','DAU-fishbowl','DAU-titan'),
1=>array('date','DNU-apollo','DNU-bossvegas','DNU-fishbowl','DNU-titan'),
2=>array('date','DNUF-apollo','DNUF-bossvegas','DNUF-fishbowl','DNUF-titan'));


for($i=0;$i<=2;$i++)
for($j=0;$j<=2;$j++)
foreach($gamelist[$i] as $k)
{
if($k=='date')
$result[$i][$j]['date'] = $test['titan'][$j]['date'];
else
{
$str = substr($k,4);
$result[$i][$j][$k] = $test[$str][$j][$k];
}
}



echo '<pre>';
var_export($result);
echo '</pre>';
ohmygirl 2011-08-30
  • 打赏
  • 举报
回复
具体的合并规则是这样的:把时间相同的各条记录合并,相同的部分合并到一条记录中:
如第一维有四个:titan,apollo,bossvegas,fishbowl
那么生成的结果数组中第三维数组应该包含五个(date,DAU-titan,DAU-fishbowl,DAU-bossvegas,DAU-apollo)

生成的结果数组的元素个数与原始数组第三维数组元素个数相等(也就是按照date合并的)。
乌镇程序员 2011-08-30
  • 打赏
  • 举报
回复
看不懂合并规则。。合并后第三维元素的值是怎么处理的,原始数据中的数字值是有含义的吧,跟第一维的键名是怎么关联起来的?
ohmygirl 2011-08-30
  • 打赏
  • 举报
回复
我只写了4个
ohmygirl 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 t5500 的回复:]

没看仔细。。这是个三维数组,第三维数组元素的键名拼接的规则是怎么样的啊,莫非原始数组$test只有固定的4个元素?
[/Quote]

恩,是个三维数组,原始的数组中有7个元素,我只写了7个,对应的把原数组的第三维除了date外的键值拼为DAU-fishbowl这种形式。
乌镇程序员 2011-08-30
  • 打赏
  • 举报
回复
1楼代码作废,特此声明。。。合并规则你要说清楚。
乌镇程序员 2011-08-30
  • 打赏
  • 举报
回复
没看仔细。。这是个三维数组,第三维数组元素的键名拼接的规则是怎么样的啊,莫非原始数组$test只有固定的4个元素?
乌镇程序员 2011-08-30
  • 打赏
  • 举报
回复
$result = array();
$i = 0;
while($ar = current($test)) {
$key = key($test);
$result[$i] = array();
foreach($ar as $v) {
//print_r($v);
$ar_keys = array_keys($v);
$ar_values = array_values($v);
for($j = 1; $j < count($ar_keys); $j ++) $ar_keys[$j] = $key.$ar_keys[$j];
array_push($result[$i], array_combine($ar_keys, $ar_values));
}
$i ++;
next($test);
}

print_r($result);

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧