从PHP数组写入CSV文件

qmelpv7a  于 2022-12-06  发布在  PHP
关注(0)|答案(4)|浏览(136)

我知道围绕这个主题已经有很多问题了。但是,由于我不是PHP开发人员,我很难找到适合我的特定对象结构的东西。我有一个非常扁平的JSON结构,可以很好地被读入PHP。我所需要做的就是遍历对象数组,从第一个对象中的键创建CSV标题(它们都是相同的),然后使用所有对象属性编写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。
UPDATE:这是我最新的PHP文件。这是可行的。我不得不将Object转换为Array来获取Keys:

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

谢谢大家的帮助。了不起的社区!

eanckbw9

eanckbw91#

要将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);
ncecgwcz

ncecgwcz2#

尝试以下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

mepcadol

mepcadol3#

我之前已经为此创建了一个函数。下面的代码没有假设有任何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"));

如果这不是你想要的,请告诉我,我会修改答案。

fsi0uk1n

fsi0uk1n4#

您可以尝试以下代码将数据写入csv

ob_start();
$outputCsv = fopen('export-csv.csv'', 'wb');
fputcsv($outputCsv, ['column header 1', 'column header 2', 'column header 3', 'column header 4'], ",");
$arOutput = [
  ['1', '2', '3', '4'],
  ['4', '6', '2', '0'],
  ['4', '6', '3', '2'],
  ['4', '7', '3', '3'],
  ['4', '3', '2', '4'],
  ['4', '4', '8', '1'],
]
foreach ($arOutput as $r)
{
    fputcsv($outputCsv, $r, ",");
}
fclose($outputCsv);

相关问题