#php #mysql #json
#php #mysql #json
Вопрос:
У меня есть массив JSON, как показано ниже:
{
"aaData": [
{
"Date_time": "23",
"traffic": "22",
"direction": "sent"
},
{
"Date_time": "24",
"traffic": "55",
"direction": "sent"
},
{
"Date_time": "25",
"traffic": "60",
"direction": "sent"
},
{
"Date_time": "26",
"traffic": "43",
"direction": "sent"
},
{
"Date_time": "27",
"traffic": "50",
"direction": "sent"
},
{
"Date_time": "23",
"traffic": "50",
"direction": "received"
},
{
"Date_time": "24",
"traffic": "42",
"direction": "received"
},
{
"Date_time": "25",
"traffic": "52",
"direction": "received"
},
{
"Date_time": "26",
"traffic": "47",
"direction": "received"
},
{
"Date_time": "27",
"traffic": "36",
"direction": "received"
}
]
}
Что я хотел бы с этим сделать, так это объединить все результаты с одной и той же датой в одну запись — поэтому для date_time 23 я хочу, чтобы это выглядело так
"Date_time": "23",
"traffic-sent": "22",
"traffic-received": "50"
Я хотел бы сделать это с помощью PHP, если это возможно? Данные поступают из двух отдельных запросов MySQL, поступающих из разных баз данных MySQL. Я попытался объединить выходные данные запроса, чтобы сделать то, что мне нужно (пробовал объединения и объединения), но не могу пройти мимо разделения результатов в соответствии с моим первым примером.
Часть SQL-запроса, создающего JSON, выглядит следующим образом:
while($row = mysqli_fetch_assoc($result)) {
$model[$i]['Date_time'] = $row['the_day'];
$model[$i]['traffic'] = $row['traffic'];
$model[$i]['direction'] = $row['TABLE_NAME'];
$i ;
}
И SQL выглядит так:
(SELECT
DAY(`Time`) AS the_day,
count(accounts.accName) AS traffic,
"sent" AS TABLE_NAME
FROM
bss.ss_sent LEFT JOIN bss.accounts ON ss_sent.Customer = accounts.accName
WHERE
YEARWEEK(`Time`) = YEARWEEK(CURRENT_DATE)
AND
Customer != " "
AND
accShortName = "QRR"
GROUP BY
the_day)
UNION
(SELECT
DAY(Date_time) AS the_day,
count(AS_Task) AS traffic,
"received" AS TABLE_NAME
FROM
im_stats.as_counter
WHERE
AS_Task = "QRR3 Incoming"
AND
YEARWEEK(Date_time) = YEARWEEK(CURRENT_DATE)
GROUP BY
the_day
Order by the_day)
ЕСЛИ кто-нибудь может посоветовать способ объединения результатов, я был бы очень признателен.
Обновить:
Вот как я ввел код Populus:
$i = 0;
while($row = mysqli_fetch_assoc($result)) {
$model[$i]['Date_time'] = $row['the_day'];
$model[$i]['traffic'] = $row['traffic'];
$model[$i]['direction'] = $row['TABLE_NAME'];
$i ;
}
$combined = array();
foreach ($model as $val) {
$date_time = $val['Date_time'];
if (!isset($combined[$date_time)) {
$combined[$date_time] = array(
'Date_time' => $date_time,
'traffic_sent' => 0,
'traffic_received' => 0,
);
}
if ('received' == $val['direction']) {
$combined[$date_time]['traffic_received'] = $val['traffic'];
} else {
$combined[$date_time]['traffic_sent'] = $val['traffic'];
}
}
header('Content-type: application/json');
print json_encode(array('aaData' => $combined), JSON_PRETTY_PRINT);
Комментарии:
1. Вы не включили оператор SQL, который вы использовали
2. Как @Populus, это может быть сделано с помощью SQL. Опубликуйте то, что вы используете в качестве своего запроса, чтобы мы могли его настроить.
3. Извините! Добавлен SQL — надеюсь, это поможет
Ответ №1:
Вероятно, это можно было бы сделать с помощью SQL (который вы не предоставили), но если вы действительно хотите PHP:
$combined = array();
foreach ($model as $val) {
$date_time = $val['Date_time'];
if (!isset($combined[$date_time])) {
$combined[$date_time] = array(
'Date_time' => $date_time,
'traffic_sent' => 0,
'traffic_received' => 0,
);
}
if ('received' == $val['direction']) {
$combined[$date_time]['traffic_received'] = $val['traffic'];
} else {
$combined[$date_time]['traffic_sent'] = $val['traffic'];
}
}
Теперь ваш желаемый массив находится внутри $combined
. Если вам не нужны ключи, вы можете удалить его:
$result = array_values($combined);
Комментарии:
1. Спасибо Populus — я добавил SQL только что. Я попробую код, который вы предоставили, и сообщу вам, как у меня дела, еще раз спасибо
2. Populus — Я ценю, что вы нашли время ответить, и я уверен, что проблема во мне, а не в вас, но, к сожалению, я не могу заставить ваш код работать. Еще раз спасибо за вашу помощь
3. с фактической страницы я ничего не получаю (она даже не приостанавливается при загрузке). Я добавил ваш код и то, как я добавил его в свой, в сообщении выше
4. можете ли вы добавить
ini_set('display_errors', 1);
в начало своего скрипта? Это может дать нам дополнительную информацию.5. Вот и все: ошибка синтаксического анализа: синтаксическая ошибка, неожиданное ‘)’, ожидание ‘]’ в /Library/Server/Web/Data/Sites/Default/scriptStats/json/sentreceivedMSS.php в строке 70 . Я изменил ( на [ и теперь получаю это: ошибка синтаксического анализа: синтаксическая ошибка, неожиданный ‘{‘ в /Library/Server/Web/Data/Sites/Default/scriptStats/json/sentreceivedMSS.php в строке 70.
Ответ №2:
Попробуйте это так:
while($row = mysqli_fetch_assoc($result)) {
if ($row['direction'] == 'sent')
$dt[$row['Date_time']]['traffic-sent'] = $row['traffic'];
elseif ($row['direction'] == 'recieved')
$dt[$row['Date_time']]['traffic-recieved'] = $row['traffic'];
}
foreach ($dt as $date) {
echo "Date_time: " . key($date) . ",<br/>" .
"traffic_sent: " . $date['traffic-sent'] . ",<br/>" .
"traffic-recieved: " . $date['traffic-recieved'] . "<br/><br/>";
}
Комментарии:
1. Извините, Switcher, я заменил свой код вашим, когда я обновляю страницу, кажется, что он думает об этом минуту или две, но не возвращает никаких результатов. Я не сомневаюсь, что делаю что-то не так, но не вижу, что