Google графики неправильная сортировка данных

Я хочу отсортировать данные по дате, но по какой-то причине они не отсортированы должным образом, например

['Sep 28',2],
['Sep 27',2],
['Oct 02',1],
['Oct 01',1],
['Sep 28',1],
['Sep 27',4],
['Sep 26',2],

Так что по дате не отсортировано.

Я получил данные из базы данных с помощью php

foreach ($array as $row){
    echo "['".date('M d', strtotime($row['date']))."',".$row['views']."],";
}

И данные отсортированы правильно, вот пример диаграмм, и вы можете увидеть проблему

https://codepen.io/anon/pen/bmzGdb

Можете ли вы показать SQL, который вы используете?

Nigel Ren 26.10.2018 08:13
SELECT * FROM views_stats WHERE content_id = ".$id." AND submitter = ".$user." ORDER BY date DESC LIMIT 30
uLike 26.10.2018 18:54
1
2
265
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

данные превращаются в строку в javascript, поэтому она будет отсортирована как строка. вместо этого используйте реальную дату в javascript.
что-то вроде...

foreach ($array as $row){
    echo "[new Date(".strtotime($row['date'])." * 1000),".$row['views']."],";
}

тогда вы можете отформатировать дату для оси, используя опцию ...

hAxis: {
  format: 'MMM dd'
}

ОБНОВИТЬ

поскольку формат не включает время, по оси абсцисс могут повторяться метки. для предотвращения используйте специальные галочки.

hAxis: {
  format: 'MMM dd',
  ticks: data.getDistinctValues(0)
}

где data - таблица данных Google ...

ОБНОВЛЕНИЕ 2

другой вариант для тиков - создать свой собственный, на основе диапазона дат графика ...

var oneDay = (1000 * 60 * 60 * 24);
var hAxisTicks = [];
var dateRange = data.getColumnRange(0);
for (var i = dateRange.min.getTime(); i <= dateRange.max.getTime(); i = i + oneDay) {
  hAxisTicks.push(new Date(i));
}

hAxis: {
  format: 'MMM dd',
  ticks: hAxisTicks
}

Да, но теперь другая проблема, проверьте скриншот i.imgur.com/1vwo80Z.jpg в тот же день, повторяется несколько раз.

uLike 26.10.2018 18:49

Вот диаграммы i.imgur.com/K64MI5t.jpg. Думаю, лучше сделать так echo "['".$row['date']."',".$row['views']."],\n";, вот результат i.imgur.com/bvi4Txu.jpg, но вопрос в том, как потом отформатировать день и убрать год? hAxis: {format: 'MMM dd'} не будет работать таким образом

uLike 26.10.2018 19:20

см. ОБНОВЛЕНИЕ 2, это должно создать согласованные тики, проблема с приведенным выше комментарием, это должна быть настоящая дата для использования format (не строка) ...

WhiteHat 26.10.2018 19:36

Хм dateRange.min.getTime is not a function

uLike 26.10.2018 20:23

первый столбец должен быть датой, а не строкой, вы все еще используете? -> echo "[new Date(".strtotime($row['date'])." * 1000),".$row['views']."],";

WhiteHat 26.10.2018 21:12

Нет у меня есть выход echo "['".$row['date']."',".$row['views']."],\n";['2018-10-25',2],

uLike 26.10.2018 21:13
'2018-10-25' - это строка, а не дата - для работы ticks должна быть настоящая дата.
WhiteHat 26.10.2018 21:16

Значит должен быть echo "[new Date(".strtotime($row['date'])." * 1000),".$row['views']."],"; это результат i.imgur.com/hLTCh38.jpg

uLike 26.10.2018 21:25

правильно, это то, что вы ищете? Если да, не могли бы вы поставить отметку рядом с кнопками голосования, чтобы отметить ответ как принятый?

WhiteHat 26.10.2018 21:27

Да, но на самом деле снова отображается дата, которой нет в базе данных, потому что я публикую снимок экрана, у меня нет даты 19.10,20.10,21.10, но на диаграмме вы можете видеть ее, я думаю, она должна быть скрыта ... это то, что мне нужно i.imgur.com/bvi4Txu.jpg, но только для изменения формата даты на Oct. 10 например

uLike 26.10.2018 21:31

Или, может быть, просто установите значение 0 для даты, которой нет в базе данных.

uLike 26.10.2018 21:38

Я нашел решение, если у кого-то такая же проблема, вот решение. Сначала вам нужно найти первый и последний день из базы данных, например MIN(date) MAX(date), а затем ...

$date_from = $rows['date_from'];
$date_from = strtotime($date_from);
$date_to  = $rows['date_to'];
$date_to = strtotime($date_to);

for ($i=$date_from; $i<=$date_to; $i+=86400)
{
  $vl = 0;
  $dt = date("Y-m-d", $i);
  foreach ($array as $row)
  {
    if ( $row["date"] == $dt)
    {
      $dt = $row["date"];
      $vl = $row["views"];
    }
  }
 echo "[new Date(".strtotime($dt)." * 1000),".$vl."],\n";
}

Этот пример работает вместе с ответом @WhiteHat выше

enter image description here

Другие вопросы по теме