2011-01-20 60 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