2017-02-08 2 views
-1

Я немного искал вокруг, но ничего не нашел, что делало именно то, что я сделал, и ничего, что действительно помогло мне в достижении того, что я хотел бы.Преобразование массива объектов в объект с суб-массивами в PHP

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

[ 
    { 
     "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" 
    ] 
} 

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

ответ

0

Настоящий рабочий пример. Вам ничего не нужно, просто 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

После игры вокруг с тем, что вы предложили, я просто идти вниз к 'Еогеасп ($ массива в $ значение) {Еогеасп ($ значение в $ ключ => $ Вэл) {$ данных [$ ключ] [ ] = $ val; }} '. PHP, похоже, создает все родительские ключи, в которых он нуждается, поскольку он идет :) –

+0

Вы прокомментировали неправильный ответ ??? Код, который вы только что опубликовали, вы использовали непосредственно из другого ответа. – AbraCadaver

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); 
Смежные вопросы