2011-01-20 59 views
0

我有以下数组(其中包含多个数据库查询的结果 - 在示例中只有2个,但可以更多) 合并需要由指定列完成(在。这种情况下,日期柱)让我们把这种merge_byPHP - 通过命名键合并多维数组

Array 
(
[0] => Array 
    (
     [0] => Array 
      (
       [date] => 2011-01-17 
       [col-1] => 58 
       [col-2] => 54 
      ) 

     [1] => Array 
      (
       [date] => 2011-01-19 
       [col-1] => 50 
       [col-2] => 61 
      ) 

     [2] => Array 
      (
       [date] => 2011-01-20 
       [col-1] => 44 
       [col-2] => 22 
      ) 

     [3] => Array 
      (
       [date] => 
       [col-1] => 448 
       [col-2] => 196 

    ) 

[1] => Array 
    (
     [0] => Array 
      (
       [date] => 2011-01-17 
       [col-3] => 1489 
      ) 

     [1] => Array 
      (
       [date] => 2011-01-18 
       [col-3] => 1534 
      ) 

     [2] => Array 
      (
       [date] => 
       [col-3] => 1534 
      ) 

    ) 

) 

我试图实现

Array 
    (
     [0] => Array 
      (
       [date] => 2011-01-17 
       [col-1] => 58 
       [col-2] => 54 
       [col-3] => 1489 
      ) 

     [1] => Array 
      (
       [date] => 2011-01-18 
       [col-1] => 
       [col-2] => 
       [col-3] => 1534 
      ) 

     [2] => Array 
      (
       [date] => 2011-01-19 
       [col-1] => 50 
       [col-2] => 61 
       [col-3] => 
      ) 

     [3] => Array 
      (
       [date] => 2011-01-20 
       [col-1] => 44 
       [col-2] => 22 
       [col-3] => 
      ) 

     [4] => Array 
      (
       [date] => 
       [col-1] => 448 
       [col-2] => 196 
       [col-3] => 1534 

    ) 

需要考虑的事情:

  • merge_by可以采取空值或空字符串值
  • merge_by不会有在要合并的阵列相同的值
  • 结果在2个查询的数量将有所不同和merge_by值可能不同,所以有可能会遇到
    $arr[0][1][date] != $arr[1][1][date]
  • LE:除了merge_by列,其他列将各不相同,所以你不会有$arr[0][0][col-2]$arr[1][0][col-2]

所以这样做的目的是通过公共列合并某些查询的列。
来自太多列的太多数据库中的太多数据只能从SQL中获取。我知道...预先计算值:) ...现在不是一个选项。

我设法使它的工作时,列的数量和这些索引匹配。自从尝试了很多选择之后,现在我有一个不适合添加它的版本作为示例。

那么有没有人可以实现上述功能的任何想法?

感谢

回答

1

首先,我要承担你的数据是按日期排序,因为你可以在SQL做到这一点,它在你的例子来分类的。你需要同时浏览你所有的套餐,并且随时随地合并。

$merged = array(); 
$i_first = 0; 
$i_second = 0; 

$count_first = count($data[0]); 
$cound_second = count($data[1]); 

while ($i_first < $count_first || $i_second < $count_second) 
{ 
    // this comparison depends on what your merge_by is 
    $diff = strtotime($data[$i_first]['date']) - strtotime($data[$i_second]['date']); 

    if ($diff == 0) 
    { 
     $merged[] = array_merge($data[$i_first], $data[$i_second]); 
     $i_first++; 
     $i_second++; 
    } 
    elseif ($diff < 0) // first date is earlier 
    { 
     $i_first++; 
    } 
    else // second date earlier 
    { 
     $i_second++; 
    } 
} 

现在你的$合并数组应该有你想要的。请注意,此解决方案假定您在一个块中没有重复的日期行,或者它会覆盖现有的结果。此外,如果您愿意,您可以扩展为拥有两个以上的数据集。

+0

作品非常感谢。对其他人可能实现的评论很少:在设置$ diff var值之后,还需要增加$ i_first和$ i_second;我在做 $ merged [] =(array)$ data [0] [$ i_first];和第二次相似; $数据有3个维度,所以还必须包含上面写的其他索引;对于一般字符串,我将diff作为strcmp比较。稍后检查如何使其获得2个以上的结果......应该不那么难。 – Mecca 2011-01-20 17:03:53