2016-07-13 98 views
0

我想將JSON轉換爲CSV文件。 這裏是我的PHP代碼:如何將子數組json轉換爲CSV文件?

<?php 
$response = '[{ 
    "field1": "vala1", 
    "field2": "vala2", 
    "field3": "vala3", 
    "field4": [{ 
     "field4a": "vala4-1", 
     "field4b": "vala4-2", 
     "field4c": "vala4-3" 
    }] 
}, { 
    "field1": "valb1", 
    "field2": "valb2", 
    "field3": "valb3", 
    "field4": [{ 
     "field4a": "valb4-1", 
     "field4b": "valb4-2", 
     "field4c": "valb4-3" 
    }] 
}]'; 

$list = json_decode($response, true); 
$fp = fopen('test_json.csv', 'w'); 

foreach ($list as $fields) { 
    fputcsv($fp, $fields, ';'); 
} 

fclose($fp); 
?> 

但是,我得到這樣的通知:

Array to string conversion

在我的CSV文件,我得到了第四列陣列值。

這裏的預期輸出:

vala1;vala2;vala3;vala4-1,vala4-2,vala4-3 
valb1;valb2;valb3;valb4-1,valb4-2,valb4-3 

,我可以得到預期值,如果我用這個代碼:

echo $fields['field1'] . ';' . $fields['field2'] . ';' . $fields['field3'] . ';' . $fields['field4'][0]['field4a'] . ',' . $fields['field4'][0]['field4b'] . ',' . $fields['field4'][0]['field4c'] . '<br>'; 

但它不是靈活.. 那麼,如何子陣JSON轉換爲CSV文件即使我在JSON文件中添加了很多字段,它也可以工作嗎?

由於提前,

+0

你正在做一個循環,這意味着你'$ fields'是孩子數組,然後嘗試轉儲爲字符串。你需要多個循環。 –

+2

[PHP將json轉換爲帶有子數組的csv]可能的副本(http://stackoverflow.com/questions/34244197/php-convert-json-into-csv-with-sub-array) – Deadpool

回答

1

編輯:我是個白癡,沒有思考過。正確的答案應該是像這樣:

foreach ($list as $fields) { 
    $flatFields = []; 
    foreach ($fields as $value) { 
     $newValue = $value; 
     if (isset($value[0]) && is_array($value[0])) { 
      $newValue = implode(',', $value[0]); 
     } 
     $flatFields[] = $newValue; 
    } 
    fputcsv($fp, $flatFields, ';'); 
} 

還沒有測試,但應該罰款。但是,如果您的子陣列也包含包含子陣列,則需要遞歸函數來處理它 - 讓我知道,然後我將更新此答案。

+0

感謝Sworrub的迴應,但我得到這個錯誤:'fputcsv()期望參數2是數組' – Julien

+0

檢查我剛剛做的編輯,我是一個白癡:P –

+0

再次感謝,但我得到這個錯誤:'解析錯誤:語法錯誤,意外'$ value'(T_VARIABLE)'。我非常抱歉...謝謝:) – Julien

0

試試這個:

... 
    $list = json_decode($response, true); 
    $fp = fopen('test_json.csv', 'w'); 

    foreach ($list as $fields) { 
     $fields['field4'] = implode(',',$fields['field4']); 
     fputcsv($fp, $fields, ';'); 
    } 

    fclose($fp); 
+0

這隻會在子陣列總是在field4的情況下工作,我猜這並非總是如此。另外,由於他的JSON結構,它應該是$ fields ['field4'] [0] - 我在我的回答中也犯了這個錯誤。 –