2013-07-18 171 views
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 

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

在此先感谢。

我想出了
+0

的输出是否有一个单一字段,如“日期”,其将作为枢轴?为给定的数据透视键重复键会发生什么? – Makita

+0

是的。关键的“日期”在所有上述阵列中都是常见的。 “日期”中也不会有重复的数组。 – Purus

+0

如果您要将Date字段更改为实际的数组键,那会是一个问题吗? – Lochemage

回答

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 
    ) 
) 
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) 
    } 
} 
+0

这给出了不同的输出。阵列 ( [2] =>数组 ( [数] => 5 [日期] => 2 ) ) – Purus

+0

HMM的我认为有一些我没有得到。我会把你的整个代码和数组创建以及结果一起发给你,告诉我有什么不同。 –

+0

当然..同时我也尝试基于你的解决方案。 – Purus

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,或遍历整个列表并手动添加'banana'字段。

+0

感谢您的答案..我没有任何主数组开始。主应该基于子数组构建..我认为当解析第二个子数组使用相同的masterArray时,这个解决方案可能会重叠值。 – Purus

+0

我试过了,正如我所说的,主表中的值被替换为处理第二个孩子。 – Purus