从PHP数组中写入CSV文件

时间:2016-02-12 14:04:12

标签: php csv fopen

我很欣赏围绕这个主题已经有很多问题。但是,由于我不是PHP开发人员,我很难为我的特定对象结构提供任何工作。我有一个非常平坦的JSON结构,可以很好地读入PHP。我需要做的就是浏览对象数组,从第一个对象中的键创建CSV标题(它们都是相同的),然后使用所有对象属性写入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文件。这有效。我不得不将Object转换为数组来获取密钥:

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

谢谢大家的帮助。惊人的社区!

3 个答案:

答案 0 :(得分:2)

要将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', 'wb');

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', 'wb');

$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字符串开始),我添加了这个例子作为将数据写入CSV文件的更好方法:

<?php

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

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

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

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

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

fclose($fp);

答案 1 :(得分:1)

尝试下面的csv解决方案标题将是(项目,成本,批准) - 用您的数组变量替换 int result = stmt.executeUpdate();

$data

有关详细信息,请参阅:PHP: fputcsv - Manual

答案 2 :(得分: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"));

如果这不是你要求的,请告诉我,我会编辑答案。