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