我很欣赏围绕这个主题已经有很多问题。但是,由于我不是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);
?>
谢谢大家的帮助。惊人的社区!
答案 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"));
如果这不是你要求的,请告诉我,我会编辑答案。