2016-06-17 36 views
0

我基於標籤關聯來預測用戶興趣。這些關聯將使用ChartJS繪製在多線圖中。我達到了數據格式幾乎可以在客戶端使用的程度。PHP中的高級陣列重建

不要被數組的大小嚇到。我的問題很簡單,但很難解決,所以看來。

考慮以下陣列(包括示例數據):

array:3 [▼ 
    "timespan" => "day", 
    "labels" => array:3 [▼ // Date labels based on timespan 
    0 => "2016-06-10" 
    1 => "2016-06-11" 
    2 => "2016-06-12" 
    ], 
    "data" => array:2 [▼ 
    0 => array:3 [▼ 
     "id" => 16473, 
     "name" => "FooTag" 
     "timeline" => array:3 [▼ 
     0 => array:3 [▼ 
      "Date" => "2016-06-10" 
      "Frequency" => 2 
      "Score" => 4.0 
     ] 
     1 => array:3 [▼ 
      "Date" => "2016-06-12" 
      "Frequency" => 2 
      "Score" => 4.0 
     ] 
     ] 
    ] 
    1 => array:3 [▼ 
     "id" => 10814, 
     "name" => "BarTag" 
     "timeline" => array:1 [▼ 
     0 => array:3 [▼ 
      "Date" => "2016-06-10" 
      "Frequency" => 2 
      "Score" => 3.0 
     ], 
     1 => array:3 [▼ 
      "Date" => "2016-06-11" 
      "Frequency" => 10 
      "Score" => 20.0 
     ] 
     ] 
    ] 
    ] 
] 

...確保每一個日期標籤(2016年6月10日,206-06-11,2016年6月12日)被覆蓋對於data[i][timeline]內的每個時間軸。如果在特定日期標籤的時間線中沒有可用數據,則必須插入一個空數組。

其結果將是:

array:3 [▼ 
    "labels" => array:3 [▼ // Date labels based on timespan 
    0 => "2016-06-10" 
    1 => "2016-06-11" 
    2 => "2016-06-12" 
    ] 
    "timespan" => "day" 
    "data" => array:2 [▼ 
    0 => array:3 [▼ 
     "id" => 16473, 
     "name" => "FooTag" 
     "timeline" => array:3 [▼ 
     0 => array:3 [▼ 
      "Date" => "2016-06-10" 
      "Frequency" => 2 
      "Score" => 4.0 
     ], 
     1 => array:0 [], // No data for label 2016-06-11, empty array added 
     2 => array:3 [▼ 
      "Date" => "2016-06-12" 
      "Frequency" => 2 
      "Score" => 4.0 
     ] 
     ] 
    ] 
    1 => array:3 [▼ 
     "id" => 10814, 
     "name" => "BarTag" 
     "timeline" => array:1 [▼ 
     0 => array:3 [▼ 
      "Date" => "2016-06-10" 
      "Frequency" => 2 
      "Score" => 3.0 
     ], 
     1 => array:3 [▼ 
      "Date" => "2016-06-11" 
      "Frequency" => 10 
      "Score" => 20.0 
     ], 
     2 => array:0 [], // No data for label 2016-06-12, empty array added 
     ] 
    ] 
    ] 
] 

在這種情況下,每一個相關的標籤有數據爲每一個日期。否則數據(頻率和分數)與繪製圖表時的正確日期不符。

我希望這樣做。提前致謝!

+2

聽起來像結果將涉及['array_splice'(HTTP: //php.net/manual/en/function.array-splice.php)。嘗試解決這個問題,就好像你只處理一個'$ timeline'數組和一個'$ labels'數組一樣。一旦你解決了問題,應該會更容易一些。 –

回答

1

假設$array['labels']是日期的最終名單,並$array['data'][$i]['timeline']將始終按升序進行排序,並不會包含日期不$array['labels']

$labels = $array['labels']; 

foreach ($array['data'] as &$tag) { 
    foreach ($labels as $i => $date) { 
     if (!isset($tag['timeline'][$i]) || $tag['timeline'][$i]['Date'] != $date) { 
     $blank = []; 
     array_splice($tag['timeline'], $i, 0, [$blank]); 
     } 
    } 
} 
+0

這是正確的,也是正確的。你的答案很棒,而且很有魅力! – JasonK