3

我有 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

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

提前致谢。

4

3 回答 3

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 个数组,它们排序的字段是“日期”。我查看了堆栈溢出,但无法为这种确切情况找到另一种解决方案。

这个产生以下 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) 
     }
} 
于 2013-07-18T16:34:40.347 回答
0

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

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,或者遍历整个列表并添加“香蕉”字段手动。

于 2013-07-18T16:52:19.783 回答
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
     )
 )
于 2013-07-18T18:14:09.480 回答