Как сгруппировать результаты mysqli_fetch_array по датам?

Я пытаюсь построить график в morrisjs, используя php/mysql, и мне нужно вывести объект в следующем формате. Он должен сгруппировать даты периода, а затем перечислить имена, следующие за ним, для сопоставления результатов:

{period: "2019-02-06 12:00:00", shelly: 2147483647, debra: 1240996571, sally: 2147483647, bill: 2147483647, bob: 619685085, jim: 126614618},
{period: "2019-02-06 12:30:00", shelly: 2147483647, debra: 1240996571, sally: 2147483647, bill: 2147483647, bob: 619685085, jim: 126614618},
{period: "2019-02-06 13:00:00", shelly: 2147483647, debra: 1240996571, sally: 2147483647, bill: 2147483647, bob: 619685085, jim: 126614618}

PHP:

    while ($row = mysqli_fetch_array($poolChart)) {
        $chart_data .= "{ \"period\": \"".$row["StatsHistoryTime"]."\", \"name\": \"".$row["name"]."\", \"hashrate\":".$row["hashrate"]."}, ";

    }
    $chart_data = substr($chart_data, 0, -2);

В настоящее время мой вывод выглядит так

[
  {
    "period": "2019-02-06 12:00:00",
    "name": "shelly",
    "hashrate": 2147483647
  },
  {
    "period": "2019-02-06 12:00:00",
    "name": "debra",
    "hashrate": 1240996571
  },
  {
    "period": "2019-02-06 12:00:00",
    "name": "sally",
    "hashrate": 2147483647
  },
  {
    "period": "2019-02-06 12:00:00",
    "name": "bill",
    "hashrate": 2147483647
  }
  {
    "period": "2019-02-06 12:30:00",
    "name": "shelly",
    "hashrate": 2147483647
  },
  {
    "period": "2019-02-06 12:30:00",
    "name": "debra",
    "hashrate": 1460613388
  },
  {
    "period": "2019-02-06 12:30:00",
    "name": "sally",
    "hashrate": 2147483647
  },
  {
    "period": "2019-02-06 12:30:00",
    "name": "bill",
    "hashrate": 2147483647
  }
]

Попробуйте json_encode — он называется JSON, нотация объектов JavaScript. Он позволяет передавать структурированные данные в виде строки. php.net/manual/en/function.json-encode.php

ArtisticPhoenix 07.02.2019 03:28

Какой у Вас вопрос? Название звучит так, как будто вы хотите использовать предложение WHERE в своем запросе. Похоже, этот Currently my output looks like this должен быть отформатирован по-другому? Также rtrim будет лучше, чем использование substr.

user3783243 07.02.2019 03:31

Я обновил пример вывода. Мне нужно сгруппировать даты, а затем вывести имена, совпадающие после.

John Lang 07.02.2019 03:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Способ решить вашу проблему — преобразовать ваши данные в соответствующий формат (массив для каждого значения периода, при этом другие значения в массиве представляют собой комбинацию каждого name и hashrate), а затем вы можете использовать json_encode для преобразования этого в требуемый формат:

$chartdata = array();
while ($row = mysqli_fetch_array($poolChart)) {
    $period = $row['StatsHistoryTime'];
    // have we already got data for this period?
    if (($k = array_search($period, array_column($chartdata, 'period'))) !== false) {
        // yes, update data for this period
        $chartdata[$k][$row['name']] = $row['hashrate'];
    }
    else {
        // no, create a new array
        $chartdata[] = array('period' => $period, $row['name'] => $row['hashrate']);
    }
}
echo json_encode($chartdata);

Вывод (для ваших образцов данных)

[
  {
    "period":"2019-02-06 12:00:00",
    "shelly":2147483647,
    "debra":1240996571,
    "sally":2147483647,
    "bill":2147483647
  },
  {
    "period":"2019-02-06 12:30:00",
    "shelly":2147483647,
    "debra":1460613388,
    "sally":2147483647,
    "bill":2147483647
  }
]

Демо на 3v4l.org

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