从 PHP 数组写入 CSV 文件
Write a CSV file from a PHP Array
我很高兴已经有很多关于这个主题的问题。但是,由于我不是 PHP 开发人员,我正在努力让任何东西都能为我的特定 object 结构工作。我有一个非常平坦的 JSON 结构,正在读入 PHP 就好了。我需要做的就是遍历 objects 的数组,从第一个 object 中的键创建 CSV 标题(它们都是相同的),然后使用编写 CSV 的每一行所有 object 属性。下面是我的 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);
?>
谢谢大家的帮助。很棒的社区!
尝试以下 csv 的解决方案 header 将是 (item, cost, approved by) - 将 $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
要将 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);
我之前为此创建了一个函数。请记住,下面的代码不假设有任何 csv headers.
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 开发人员,我正在努力让任何东西都能为我的特定 object 结构工作。我有一个非常平坦的 JSON 结构,正在读入 PHP 就好了。我需要做的就是遍历 objects 的数组,从第一个 object 中的键创建 CSV 标题(它们都是相同的),然后使用编写 CSV 的每一行所有 object 属性。下面是我的 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);
?>
谢谢大家的帮助。很棒的社区!
尝试以下 csv 的解决方案 header 将是 (item, cost, approved by) - 将 $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
要将 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);
我之前为此创建了一个函数。请记住,下面的代码不假设有任何 csv headers.
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"));
如果这不是您要的,请告诉我,我会编辑答案。