+ -
当前位置:首页 → 问答吧 → 求合并数组的高效方法

求合并数组的高效方法

时间:2011-08-30

来源:互联网

PHP code

//原始的数组如下:
  $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'=>''))    
     );



求合并数组的高效方法。

作者: ohmygirl   发布时间: 2011-08-30

PHP code
$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);

作者: T5500   发布时间: 2011-08-30

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

作者: T5500   发布时间: 2011-08-30

1楼代码作废,特此声明。。。合并规则你要说清楚。

作者: T5500   发布时间: 2011-08-30

引用 2 楼 t5500 的回复:

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


恩,是个三维数组,原始的数组中有7个元素,我只写了7个,对应的把原数组的第三维除了date外的键值拼为DAU-fishbowl这种形式。

作者: ohmygirl   发布时间: 2011-08-30

我只写了4个

作者: ohmygirl   发布时间: 2011-08-30

看不懂合并规则。。合并后第三维元素的值是怎么处理的,原始数据中的数字值是有含义的吧,跟第一维的键名是怎么关联起来的?

作者: T5500   发布时间: 2011-08-30

具体的合并规则是这样的:把时间相同的各条记录合并,相同的部分合并到一条记录中:
如第一维有四个:titan,apollo,bossvegas,fishbowl
那么生成的结果数组中第三维数组应该包含五个(date,DAU-titan,DAU-fishbowl,DAU-bossvegas,DAU-apollo)

生成的结果数组的元素个数与原始数组第三维数组元素个数相等(也就是按照date合并的)。

作者: ohmygirl   发布时间: 2011-08-30