Преобразование массива объектов в объект с вложенными массивами в Stack Overflow

Я немного искал, но не нашел ничего, что бы точно соответствовало тому, что я ищу, и ничего, что действительно помогло бы мне достичь того, что я хотел бы.

У меня есть данные в этом формате из БД:

[
{
"datetime": "20170208183021",
"ping": "11.201858520507812",
"download": "28129628.324328355",
"upload": "65169139.37489863"},
{
"datetime": "20170208181514",
"ping": "7.826685905456543",
"download": "300487650.87967044",
"upload": "128210163.86553746"},
{
"datetime": "20170208180034",
"ping": "19.550085067749023",
"download": "17300126.504837424",
"upload": "16650978.464359928"}
]

Я хотел бы преобразовать все это в этот формат:

{
"datetime": [
"20170208183021",
"20170208181514",
"20170208180034"],
"ping": [
"11.201858520507812",
"7.826685905456543",
"19.550085067749023"],
"download": [
"28129628.324328355",
"300487650.87967044",
"17300126.504837424"],
"upload": [
"65169139.37489863",
"128210163.86553746",
"16650978.464359928"]
}

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

-1

Решение

Вот рабочий пример. Вам не нужно ничего причудливого, простого foreach сделает свое дело.

$json = <<<EOS
[
{
"datetime": "20170208183021",
"ping": "11.201858520507812",
"download": "28129628.324328355",
"upload": "65169139.37489863"},
{
"datetime": "20170208181514",
"ping": "7.826685905456543",
"download": "300487650.87967044",
"upload": "128210163.86553746"},
{
"datetime": "20170208180034",
"ping": "19.550085067749023",
"download": "17300126.504837424",
"upload": "16650978.464359928"}
]
EOS;

$array = \json_decode($json, true);
$results = [
'datetime' => [],
'ping'     => [],
'download' => [],
'upload'   => [],
];

foreach ($array as $value) {
$results['datetime'][] = $value['datetime'];
$results['ping'][]     = $value['ping'];
$results['download'][] = $value['download'];
$results['upload'][]   = $value['upload'];
}

$results = \json_encode($results, JSON_PRETTY_PRINT);
echo $results;
0

Другие решения

Это JSON, поэтому предположим, что вы декодируете его как массив:

$array = json_decode($json, true);

Чтобы построить его динамически, независимо от количества ключей, просто зациклите один, чтобы получить имена ключей и извлечь их:

foreach($array[0] as $key => $val) {
$result[$key] = array_column($array, $key);
}

Более длинный путь вокруг:

foreach($array as $values) {
foreach($values as $key => $val)
$result[$key][] = $val;
}

Это будет объект при кодировании:

$array = json_encode($result);
0

По вопросам рекламы [email protected]