2016-02-18 7 views
1

Я сделал сценарий для отслеживания посетителей на своем веб-сайте, и теперь я хочу отображать количество посетителей в день в графике Google Line с JSON.PHP массив справа JSON формат?

Это некоторый PHP код, который я написал для отображения даты и количество посетителей в этот день в массиве:

$dateQuery = $db->prepare("SELECT date FROM tracked"); 
$dateQuery->execute(); 
$rows = $dateQuery->fetchAll(PDO::FETCH_ASSOC); 
$array = array(); 
foreach ($rows as $row) { 
    $day = explode(' ', $row['date']); 
    if (!key_exists($day[0], $array)) { 
     $array[$day[0]] = 0; 
    } 
    $array[$day[0]] += 1; 
} 

Это выход, когда я print_r массив:

array output

Теперь для этого вывода для работы в API графиков Google мне нужен формат JSON, чтобы он был таким:

[["2016-02-18",6],["2016-02-17",5]] 

Вместо этого я получаю это с json_encode ($ массив):

{"2016-02-17":5,"2016-02-18":6} 

У меня есть базовое понимание теперь массивов и петель, но я не могу придумать решение, чтобы решить мою проблему.

+2

Не используйте дату в качестве ключа. Сделайте массив, который состоит из даты и количества посетителей. –

ответ

1

Вы можете легко оптимизировать запрос в первую очередь, делая ваши данные выглядят так же, как вам нужно без лишних петель позже:

$dateQuery = $db->prepare("SELECT 
     DATE(date) AS date, 
     COUNT(tracked.id) AS count 
    FROM tracked 
    GROUP BY DATE(date)"); 
$dateQuery->execute(); 
$rows = $dateQuery->fetchAll(PDO::FETCH_ASSOC); 

(я не знаю, если таблица имеет " id ", но я уверен, что вы поняли эту идею). И тогда это так же просто, как

$result = array(); 
foreach ($rows as $row) { 
    $result[] = array($row['date'], $row['count']); 
} 
echo json_encode($result); 
+0

Это очень удобный код, но теперь это эхо выглядит примерно так: ["2016-02-17", "1"], ["2016-02-17", "1"]. Посетители должны быть сгруппированы по дате. Каково решение? – Ramon

+0

Я изменил свой ответ, для чего он сейчас стоит. Должно быть сгруппировано по 'DATE (date)' вместо просто 'date'. –

1

Просто написал простой код для преобразования вашего массива.

<?php 
$array = []; 
$array['2016-01-17'] = 7; 
$array['2016-02-18'] = 6; 

echo json_encode($array); // output is: {"2016-01-17":7,"2016-02-18":6} 

$arrayInRightFormat = []; 

foreach ($array as $i => $value) { 
    $arrayInRightFormat[] = [$i, $value]; 
} 

echo json_encode($arrayInRightFormat); // output is: [["2016-01-17",7],["2016-02-18",6]] 

Defacto вы используете ваш массив подобен HashMap с Струнными ключами поэтому его конвертирован в Словарь.

Лучшая идея заключается в том, чтобы база данных mysql суммировала данные, а затем конвертировала их прямо в нужный формат!

<?php 
$dateQuery = $db->prepare("SELECT DATE(date) as day,count(*) as hits FROM tracked GROUP BY DATE(date)"); 
$dateQuery->execute(); 
$rows = $dateQuery->fetchAll(PDO::FETCH_ASSOC); 

$array = array(); 
foreach ($rows as $row) { 
    $array[] = [$row['day'], $row['hits']]; 
} 

echo json_encode($array); // output is: [["2016-01-17",7],["2016-02-18",6]] 
+0

Удивительный! Это сделал трюк. К сожалению, API графиков Google теперь думает, что моя дата - это строка. Вы знаете какое-либо решение? Он принимает только что-то вроде этого: [новая дата (2016, 2, 17), 5] (5 - количество посетителей). – Ramon

+0

Вы можете просто преобразовать его, используя javascript: new Date ('2011-04-11') делает трюк. Если вы массивы имен ChartArray в js: for (i = 0; i Kordi

Смежные вопросы