2016-04-06 2 views
0

Я получаю JSON от завитка поста, и это выглядит примерно так:PHP JSON в CSV-файл с заголовками

{"status":"ok","sent":177,"delivered":0,"bounced":5,"hardBounced":0,"softBounced":5,"opened":[46,81],"clicked":[5,5],"notsent":[2,2],"notopened":126,"optout":0,"spam":0,"lastOpen":"1 day ago","lastClick":"13 days ago","lastOpenTS":1459808038636,"lastClickTS":1458752521593,"rebroadcast":0,"rebroadcastClick":0,"msgId":"s-04ac-1603","subject":"Blah blah Conference and Exposition","title":"Blah followup 03.22.16","sentto":["l-160f"],"suppressedon":[]} 

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

для просмотра того, что преобразуется из JSON как строку в массив/объект:

$result = curl_exec($ch_list); 
$jsonObj = print_r(json_decode($result, true)); 
var_dump($jsonObj);die(); 

что дает следующее:

Array 
(
[status] => ok 
[sent] => 177 
[delivered] => 0 
[bounced] => 5 
[hardBounced] => 0 
[softBounced] => 5 
[opened] => Array 
    (
     [0] => 46 
     [1] => 81 
    ) 

[clicked] => Array 
    (
     [0] => 5 
     [1] => 5 
    ) 

[notsent] => Array 
    (
     [0] => 2 
     [1] => 2 
    ) 

[notopened] => 126 
[optout] => 0 
[spam] => 0 
[lastOpen] => 1 day ago 
[lastClick] => 14 days ago 
[lastOpenTS] => 1459808038636 
[lastClickTS] => 1458752521593 
[rebroadcast] => 0 
[rebroadcastClick] => 0 
[msgId] => s-04ac-1603 
[subject] => AFSA Vehicle Finance Conference and Exposition 
[title] => AFSA follow up 03.22.16 
[sentto] => Array 
    (
     [0] => l-160f 
    ) 

[suppressedon] => Array 
    (
    ) 

) 

На этом этапе я думаю, что я преобразовал его в массив, который должен привести к созданию файла csv, и я могу использовать код, рекомендованный всеми в таком количестве сообщений, и я получил ошибку , но это было исправлено выражением if после fopen. Все вместе это теперь создает CSV-файл с ничего внутри него:

$result = curl_exec($ch_list); 
$jsonObj = print_r(json_decode($result)); 

if(!file_exists('/tmp/' . $msgId . '_' . $yearMonComb . '.csv')) { 
    $f = fopen('/tmp/' . $msgId . '_' . $yearMonComb . '.csv', 'w'); 
    if (is_array($jsonObj) || is_object($jsonObj)) { 
     $firstLineKeys = false; 
     foreach ($jsonObj as $line) { 
      if (empty($firstLineKeys)) { 
       $firstLineKeys = array_keys($line); 
       fputcsv($f, $firstLineKeys); 
       $firstLineKeys = array_flip($firstLineKeys); 
      } 
      fputcsv($f, array_merge($firstLineKeys, $line)); 
     } 
    } 
    fclose($f); 
} 
+0

Пожалуйста вывесить выход из 'print_r ($ strToArr)', чтобы мы могли видеть то, что вы переходя в 'fputcsv()' (который, как ожидается, будет простым одномерным a rray) –

+1

Вложение 'json_encode()' внутри 'json_decode()' немного подозрительно - каково исходное содержимое '$ result'? Пожалуйста, напишите 'var_dump ($ result)' также. Если это не то, что может быть закодировано json, это вернет 'false', а' json_decode() 'в свою очередь не приведет к чему-то, что можно использовать с помощью' fputcsv() '. –

+0

print_r ($ strToArr) производит то же самое, что и print_r (результат). Я предполагаю, что я не делаю массив вообще – kronus

ответ

0

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

$result = curl_exec($ch_list); 
$jsonObj = json_decode($result, true); 

$f = fopen('/tmp/' . $msgId . '_' . $yearMonComb . '.csv', 'w'); 
fputcsv($f, array_keys($jsonObj)); 
$transposed = array(); 

if (is_array($jsonObj)) { 
    foreach($jsonObj as $key => $record){ 
     if(is_array($record) && count($record) > 0){ 
      $target = count($record) - 1; 
      $transposed[$key] = $jsonObj[$key][$target]; 
     }else{ 
      $transposed[$key] = $record; 
     } 
    } 
    fputcsv($f, array_values($transposed)); 
} 
fclose($f); 

echo $result; 
curl_close($ch_list); 

Это данные JSon после выполнения print_r:

Array 
(
[status] => ok 
[sent] => 177 
[delivered] => 0 
[bounced] => 5 
[hardBounced] => 0 
[softBounced] => 5 
[opened] => Array 
    (
     [0] => 46 
     [1] => 81 
    ) 

[clicked] => Array 
    (
     [0] => 5 
     [1] => 5 
    ) 

[notsent] => Array 
    (
     [0] => 2 
     [1] => 2 
    ) 

[notopened] => 126 
[optout] => 0 
[spam] => 0 
[lastOpen] => 1 day ago 
[lastClick] => 14 days ago 
[lastOpenTS] => 1459808038636 
[lastClickTS] => 1458752521593 
[rebroadcast] => 0 
[rebroadcastClick] => 0 
[msgId] => s-04ac-1603 
[subject] => Blah blah Conference and Exposition 
[title] => Blah blah follow up 03.22.16 
[sentto] => Array 
    (
     [0] => l-160f 
    ) 

[suppressedon] => Array 
    (
    ) 

) 

В результате получился файл csv размером 398 байт.

Чтобы ответить на вопрос @ axiac, в случае, когда массив имеет массив как его значение. Условные тесты для массива:

if(is_array($record) && count($record) > 0) 

Если есть массив, то получите последний элемент массива.

Я надеюсь, что это поможет кому-то, потому что это сводит меня с орехами

Другой редактировать, потому что я нашел способ перебрать массив массива

я создал отдельный файл PHP, чтобы собрать элементы, являются массивы в пределах массива - с массивом, находясь в пункте $ jsonObj [ «результат»] родительского массива

 $jsonObj = json_decode($result, true); 
     $f = fopen($value . '-sent.csv', 'w'); 

     $headers = array('listid', 'name', 'when', 'recid', 'email', 'ts'); 

     if (is_array($jsonObj)) { 
      fputcsv($f, $headers); 
      foreach ($jsonObj['result'] as $fields) { 
       fputcsv($f, $fields); 
      } 
     } 
     fclose($f); 

     curl_close($ch_list); 
0

То, что вы, вероятно, хотите есть:

$result = curl_exec($ch_list); 
// Decode the JSON representation into PHP data structures 
// The second argument asks to return arrays (TRUE), not objects (FALSE or missing) 
$data = json_decode($result, true); 

$f = fopen($filename, 'w'); 

// Header line: the field names (keys in $data) 
fputcsv($f, array_keys($data), ','); 
// Data line (can use array_values($data) or just $data as the 2nd argument) 
fputcsv($f, array_values($data), ','); 

fclose($f); 
+0

Все еще производит пустой файл – kronus

+0

Код, который я разместил, не обрабатывает ошибки. Тебе следует это сделать. Возможно, '$ result' является' FALSE' (поскольку запрос HTTP не удался). Я попробовал это с JSON, который вы отправили (вместо вызова 'curl_exec()'), и он работал нормально. Помимо того факта, что массив, декодированный из JSON, содержит массивы для некоторых ключей (и они не могут быть представлены в формате CSV, как они есть). – axiac

+0

Да, я подумал об этом, прежде чем я наткнулся на эти другие вопросы - как я буду разбираться с массивами внутри массива. Я попытался просто откликнуться на результат и обработать его с помощью javascript, но тогда я не могу создать файл csv. Это сводит меня с ума – kronus

Смежные вопросы