Объединить результаты одного вывода JSON с PHP

#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, я заменил свой код вашим, когда я обновляю страницу, кажется, что он думает об этом минуту или две, но не возвращает никаких результатов. Я не сомневаюсь, что делаю что-то не так, но не вижу, что