2016-02-12 74 views
0

我明白這個主題已經有很多問題了。但是,由於我不是PHP開發人員,因此我正努力爲我的特定對象結構獲取任何內容。我有一個非常平坦的JSON結構,正在讀入PHP中。我所需要做的就是遍歷對象數組,使用第一個對象中的鍵創建CSV標題(它們全都相同),然後使用所有對象屬性編寫CSV的每一行。這裏看看我的PHP數據:從PHP陣列寫入一個CSV文件

Array 
(
    [0] => stdClass Object 
     (
      [record id] => -KA9S-beTbe9LIPBm_xK 
      [timestamp] => Wed Feb 10 2016 10:12:20 GMT+0100 
      [user id] => 33037t23nxyx1x5k 
      [user age] => 18-24 
      [user gender] => M 
      [user q1] => Yes 
      [user q2] => Yes 
      [user q3] => more 
      [answer q1 value] => 1 
      [answer q1 confidence] => 3 
      [answer q1 duration] => 262412 
      [answer q2 value] => 1 
      [answer q2 confidence] => 3 
      [answer q2 duration] => 1959 
      [answer q3 value] => 0 
      [answer q3 confidence] => 3 
      [answer q3 duration] => 2939 
      [answer q4 value] => 1 
      [answer q4 confidence] => 2 
      [answer q4 duration] => 1868 
      [answer q5 value] => 1 
      [answer q5 confidence] => 2 
      [answer q5 duration] => 2196 
     ) 

所以,你可以看到它應該是非常簡單的。鍵將是CSV單元格標題,然後是每條記錄的一行。

我希望有人能幫助我。我根本不知道PHP。

更新:這是我最新的PHP文件。這工作。我不得不將對象投射到一個陣列才能獲得密鑰:

<?php 

    $data = $_POST['data']; 
    $response = json_decode($data); 

    $records_arr = $response->records; 

    $fp = fopen('records.csv', 'w'); 
    $i = 0; 

    foreach ($records_arr as $record) { 


     // $record is an object so create an array 
     $record_arr = array(); 

     foreach ($record as $value) { 
      $record_arr[] = $value; 
     } 

     if($i == 0){ 
      fputcsv($fp, array_keys((array)$record)); 
     } 
     fputcsv($fp, array_values($record_arr)); 
     $i++; 
    } 

    fclose($fp); 

    echo print_r($records_arr); 
?> 

謝謝大家的幫助。驚人的社區!

回答

1

對於寫PHP數組到一個CSV文件,你應該使用內置的PHP函數fputcsv

<?php 

$list = array (
    array('header 1', 'header 2', 'header 3', 'header 4'), 
    array('5656', '454545', '5455', '5454'), 
    array('541212', '454545', '5455', '5454'), 
    array('541212', '454545', '5455', '5454'), 
); 

$fp = fopen('file.csv', 'w'); 

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

fclose($fp); 

編輯:根據您輸入的數據

更具體的例子:

<?php 

// I had to recreate your data, this is just an example 
$array_of_objects = array(); 
for($i = 0; $i < 5; $i++) 
{ 
    $obj = new \stdClass(); 
    $obj->username = "Rein"; 
    $obj->answer = "Correct"; 
    $obj->awesomeness = 1000; 

    $array_of_objects[] = $obj; 
} 

// Open a file to write to 
$fp = fopen('file.csv', 'w'); 

$i = 0; 

// Loop the array of objects 
foreach($array_of_objects as $obj) 
{ 
    // Transform the current object to an array 
    $fields = array(); 

    foreach ($obj as $k => $v) 
    { 
     $fields[ $k ] = $v; 
    } 

    if($i === 0) 
    { 
     fputcsv($fp, array_keys($fields)); // First write the headers 
    } 

    fputcsv($fp, $fields); // Then write the fields 

    $i++; 
} 

fclose($fp); 

編輯2:

基於新的信息(你有一個JSON字符串開始),我m增加了這個例子,作爲將數據寫入CSV文件的更好方法:

<?php 

$data = json_decode($_POST['data'], TRUE); 
$records = $data['records']; 

$fp = fopen('records.csv', 'w'); 

$i = 0; 
foreach ($records as $record) { 

    if($i === 0) { 
     fputcsv($fp, array_keys($record)); 
    } 

    fputcsv($fp, array_values($record)); 
    $i++; 
} 

fclose($fp); 
+0

這更像它!我快到了。我只是努力獲得對象鍵的初始數組。 –

+0

我以完全動態的方式更新我的最後一個示例,以便將標題存儲在CSV中。如果你要改變對象的屬性,CSV會跟着正確的標題。請注意,它僅從數組中的第一個對象獲取屬性以構建CSV標頭。 – Rein

+0

謝謝兄弟。這是我需要的幫助。我不得不調整一下,並用最終的PHP更新我的問題。 –

1

試試下面CSV的解決方案頭會(項目,費用,批准) - 與您的數組變量替換$data

$data = array(
    array('item' => 'Server', 'cost' => 10000, 'approved by' => 'Joe'), 
    array('item' => 'Mt Dew', 'cost' => 1.25, 'approved by' => 'John'), 
    array('item' => 'IntelliJ IDEA', 'cost' => 500, 'approved by' => 'James') 
); 

$fp = fopen('file.csv', 'w'); 
$i = 0; 
foreach ($data as $fields) { 
    if($i == 0){ 
     fputcsv($fp, array_keys($fields)); 
    } 
    fputcsv($fp, array_values($fields)); 
    $i++; 
} 

fclose($fp); 

更多的細節必須在alook:PHP: fputcsv - Manual

+0

我認爲我的問題是我有一個對象數組。我想我需要在它到達PHP之前將其展平,以便我可以使用這個腳本。 –

+0

http://stackoverflow.com/questions/19495068/convert-stdclass-object-to-array-in-php – Rein

+1

在foreach循環中添加一個新行:'$ fields =(array)$ fields' –

1

我已經爲此創建了一個函數之前。謹記下面的代碼不會假定有任何csv頭文件。

function doCSV($file, $content = array()) 
{ 
    $handle = fopen($file, "w"); 
    foreach($content as $value) { 
     fputcsv($handle, array(key($content), $value)); 
    } 

    fclose($handle); 
} 

doCSV("test.csv", array("Test 1" => "Value 1", "Test 2" => "Value 2")); 

如果這不是你所要求的讓我知道,我會編輯答案。

+0

我的問題是我有一個對象數組。所以,我需要將它們解包到一個Array中才能工作。我認爲。 –

+0

@LeeProbert您能否至少提供數據來源? –

+0

數據結構從json解碼。我更新了我的PHP。 –