从多个阵列创建主阵列

时间:2013-07-18 16:04:15

标签: php arrays consolidation

我有2个阵列(也可能更多),他们可能有散射数据。

Date    | Apple                       Date    | Banana  
-----------------                    -------------------
   1      |   5                         1     |   3
   4      |   5                         3     |   1
   5      |   5                         7     |   2

数组结构如下所示。

array
(
   [0] => array
   (
      [date] => 4
      [apple] => 5
   )
   [1] => array
   (
       [date] => 5
       [apple] => 5
   )
)

我需要的是拥有一个具有两个细节的整合数组。示例如下所示。

Date      Apple      Banana
-------------------------------    
 1          5          3
 3          0          1
 4          5          0
 5          5          0
 7          0          2

考虑到数组可以容纳多个值这一事实,我们能做到最好吗?任何提示都会帮助我解决这个问题。或者如果已经讨论过,请指出我正确的链接。我在搜索过程中找不到任何东西。

提前致谢。

3 个答案:

答案 0 :(得分:1)

我想出的最好的事情就是:

for($i=0; $i<5; $i++){
        $t = $i;
        $t1 = $t+3;
        $te= $i+5;
        $ti = $i+10;
        $a[] = array(
            'date' => $t,
            'bannana' => $te,
            'tea' => $ti,
        );

        $b[] = array(
            'date' => $t1,
            'lemon' => $te,
        );

        $ar1[]=$a;
        $ar2[]=$b;
    }



    foreach($a as $key=>$value){
        foreach($value as $k=>$v){
            $ar[$value['date']][$k]=$v;
        }
    }

    foreach($b as $key=>$value){
        foreach($value as $k=>$v){
            $ar[$value['date']][$k]=$v;
        }
    }

    echo var_dump($ar);

其中$ a和$ b是2个数组,而它们的排序字段是'date'。我查看了堆栈溢出,但是对于这个确切的情况却无法获得另一种解决方案。

这个产生以下var_dump():

array(8) { 
     [0]=> array(3) { 
          ["date"]=> int(0) 
          ["bannana"]=> int(5) 
          ["tea"]=> int(10) 
     }
     [1]=> array(3) { 
          ["date"]=> int(1) 
          ["bannana"]=> int(6) 
          ["tea"]=> int(11) 
     } 
     [2]=> array(3) { 
          ["date"]=> int(2) 
          ["bannana"]=> int(7) 
          ["tea"]=> int(12) 
     } 
     [3]=> array(4) { 
          ["date"]=> int(3) 
          ["bannana"]=> int(8) 
          ["tea"]=> int(13) 
          ["lemon"]=> int(5) 
     } 
     [4]=> array(4) { 
          ["date"]=> int(4) 
          ["bannana"]=> int(9) 
          ["tea"]=> int(14) 
          ["lemon"]=> int(6) 
     } 
     [5]=> array(2) { 
          ["date"]=> int(5) 
          ["lemon"]=> int(7) 
     } 
     [6]=> array(2) {
          ["date"]=> int(6) 
          ["lemon"]=> int(8) 
     } 
     [7]=> array(2) { 
          ["date"]=> int(7) 
          ["lemon"]=> int(9) 
     }
} 

答案 1 :(得分:0)

使用for循环,您可以遍历要添加的数组,在主表中查找现有的“Date”条目,或者创建一个与要添加的数组的当前“Date”值匹配的新条目。如果主表中的条目数据需要它没有的新属性类型(例如Apple,Banana),则将其添加到数据中。我还建议您使用'Date'作为数组键,以这种方式快速查找匹配将更容易:

foreach ($appleArray as $value) {
  $date = $value['date'];
  if (isset($masterArray[$date])) {
    // Goes here if the date exists in the master array already.
    // In this case, we just append to our data the fields
    // found in the $value.
    foreach ($value as $subKey => $subValue) {
      // Iterate through each value, skip our 'date' key, and append
      // each other item to our master array.
      if ($subKey != 'date') {
        $masterArray[$date][$subKey] = $subValue;
      }
    }
  } else {
    // Goes here if the date isn't in the master array yet.
    // In this case, create a new entry and just copy the data.
    $masterArray[$date] = $value;
  }
}

在这个系统中,当一个日期条目包含一个苹果但不包含香蕉等时,会丢失字段。在这些情况下,您可以假设这些值为0,或者遍历整个列表并添加'手动香蕉田。

答案 2 :(得分:0)

基于@Hristo响应,我修改了代码,它按以下方式工作。通过这种方式,我得到了预期的输出。

下面不是我使用的确切代码。我已修改为与问题中发布的示例保持一致。

这会在一个巨大的阵列中运作良好吗?

    $finalArray = array();

    foreach ($apple as $key => $value) {
         $finalArray[$value['date']]['apple'] = $value['apple'];
    }

    foreach ($banana as $key => $value) {
         $finalArray[$value['date']]['banana'] = $value['banana'];
    }

    var_dump($finalArray);

这给出了

的输出
 array
 (
     [1] => array
     (
        [apple] => 5
        [banana] => 3
     )
 )