从PHP数组中写入CSV文件

从PHP数组中写入CSV文件,php,csv,fopen,Php,Csv,Fopen,我理解围绕这个主题已经有很多问题了。但是,由于我不是一名PHP开发人员,我正在努力使任何东西都适合我的特定对象结构。我有一个非常简单的JSON结构,可以很好地读入PHP。我需要做的就是遍历对象数组,从第一个对象中的键创建CSV标题(它们都是相同的),然后使用所有对象属性写入CSV的每一行。下面是我的PHP数据: Array ( [0] => stdClass Object ( [record id] => -KA9S-beTbe9LIP

我理解围绕这个主题已经有很多问题了。但是,由于我不是一名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文件。这很有效。我必须将对象投射到数组中才能获得密钥:

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


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

请尝试以下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数组写入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);

我以前已经为此创建了一个函数。请记住,下面的代码并不假设有任何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"));

如果这不是您想要的,请告诉我,我将编辑答案。

我想我的问题是我有一个对象数组。我想我需要在它进入PHP之前把它展平,这样我才能使用这个脚本。在foreach循环中再添加一行:
$fields=(array)$fields
@ChetanAmeta我想值得注意的是,使用这个解决方案,值的顺序确实很重要。如果最后以不同的顺序写入值,那么即使使用了相同的键,也会在CSV中出现错误的标题。我只是想强调一下。您甚至可以为每个字段行编写完全不同的键。在我看来这完全没用。为什么不先添加头呢?@Rein是的,可以这样做,但根据问题,他想使用键作为头,还假设他的数组中的键是相同的。我的问题是我有一个对象数组。所以,我需要将它们展开成一个数组,这样才能工作。我想。@LeeProbert你至少能提供数据来源吗?数据结构是从json解码的。我已经用我的PHP更新了。@LeeProbert如果你共享了json数据,那么现在你就会有一个解决方案了。我知道你有一个json字符串,我们不会将对象数组转换为数组。我们会告诉您将
json_decode
的第二个参数设置为
TRUE
,返回一个数组。这更像是这样!我快到了。我只是在努力获取对象键的初始数组。我用一种完全动态的方式更新了我的上一个示例,将标题也存储在CSV中。如果要更改对象的属性,CSV后面会有正确的标题。请注意,它只从数组中的第一个对象获取属性来构建CSV头。谢谢你。这就是我需要的帮助。我不得不稍微调整一下,并用最终的PHP更新了我的问题。太棒了!很高兴能为您提供帮助。请注意:如果您从一个JSON字符串开始,并且想要一个数组,只需使用
JSON\u decode($string,TRUE)
。它会给你一个数组。
<?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);
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"));