Я предсказываю интересы пользователей на основе ассоциаций тегов. Эти ассоциации будут отображены в многострочном графике с использованием ChartJS. Я дошел до того, что формат данных практически готов к использованию на стороне клиента.
Не пугайтесь размера массива. Мой вопрос довольно простой, но его сложно решить.
Рассмотрим следующий массив (включая пример данных):
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-06-10, 206-06-11, 2016-06-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
]
]
]
]
В этом случае каждый связанный тег имеет данные для каждой даты. В противном случае данные (частота и оценка) не будут соответствовать правильной дате при построении графика.
Я надеюсь, что это имеет смысл. Заранее спасибо!
Если предположить, $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]);
}
}
}
Других решений пока нет …