我有一个上传到我的服务器的CSV文件,PHP脚本将在该文件中解析并通过AJAX将输出返回给JavaScript。
CSV文件由两行组成。第一行包含列名,第二行包含数据。我正在尝试编写一个脚本,该脚本将以Javascript可用于生成文本字段和使用此数据填充的标签的形式对其进行解析。我现有的方法是:
if ( $_FILES['parameter_file']['tmp_name'] ) {
$paramfile = fopen($_FILES['parameter_file']['tmp_name'], 'r');
$header = fgets($paramfile);
$temp = explode(',', str_replace('"', '', rtrim(ltrim($header))));
$userdata = fgets($paramfile);
$temp2 = explode(',', str_replace('"', '', rtrim(ltrim($userdata))));
for ($k = 0; $k <= sizeof($temp) - 1; $k++) {
$userparam[strtolower($temp[$k])] = $temp2[$k];
}
fclose($paramfile);
}
我可以看到一般性改善的空间,随意指出它们。但主要问题是我需要的是json_encode。什么更有效率?一个更好的主意?
全部谢谢
答案 0 :(得分:4)
正如Lukáš Lalinský在他对csl's answer fgetcsv()
的评论中所写的那样是你的朋友(顺便说一句str_getcsv()
在PHP 5.3之前不可用)。
代码应该很简单(错误处理留给OP):
$headers = null;
$rowNum = 0;
$tableData = array();
$handle = fopen($_FILES['parameter_file']['tmp_name'], 'r');
while (($data = fgetcsv($handle)) !== false) {
if ($rowNum == 0) {
// parsing the CSV header
$headers = array();
foreach ($data as $d) {
$headers[] = $d;
}
} else {
// parsing the data rows
$rowData = array();
foreach ($data as $d) {
$rowData[] = $d;
}
$tableData[] = array_combine($headers, $rowData)
}
$rowNum++;
}
fclose($handle);
给出CSV文件:
id,name,value
1,first,value1
2,second,value2
3,third,value3
这将为您提供headers
- 数组
array(
0 => 'id',
1 => 'name',
2 => 'value'
)
和$tableData
- 数组
array(
0 => array(
'id' => '1',
'name' => 'first',
'value' => 'value1'
),
1 => array(
'id' => '2',
'name' => 'second',
'value' => 'value2'
),
2 => array(
'id' => '3',
'name' => 'third',
'value' => 'value3'
)
)
根据需要调整代码......
答案 1 :(得分:2)
我宁愿使用str_getcsv() / fgetcsv(),然后使用json_encode()。在这两者之间,您可以随时随地移动数据,以便根据需要显示输出的JSON。
一般情况下,如果库函数可用,最好使用库函数。