2016-02-12 3 views
0

Я ценю, что по этому вопросу уже много вопросов. Но, поскольку я не разработчик PHP, я изо всех сил пытаюсь заставить что-то работать для моей конкретной структуры объекта. У меня довольно плоская структура JSON, которая хорошо читается на PHP. Все, что мне нужно сделать, это пройти через массив объектов, создать заголовки CSV из ключей в первом объекте (они все одинаковые), а затем записать каждую строку CSV, используя все свойства объекта. Вот мои данные PHP:Напишите CSV-файл из массива PHP

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); 

Edit:

Более конкретный пример, основанный на входных данных:

<?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); 

Edit 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

Try ниже решение заголовка 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); 

более подробно то советуют на: 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

Моя проблема в том, что у меня есть массив объектов. Итак, мне нужно будет развернуть их в Массив, чтобы это работало. Я думаю. –

+0

@ LeeProbert вы можете по крайней мере предоставить источник, откуда поступают данные? –

+0

Структура данных декодируется из json. Я обновил свой PHP. –