Php 使用第一行作为键将CSV重新映射为数组
假设我有一个CSV文件,它看起来像:Php 使用第一行作为键将CSV重新映射为数组,php,arrays,csv,sorting,Php,Arrays,Csv,Sorting,假设我有一个CSV文件,它看起来像: [Line 1]: ID, Name, Birthday, Phonenumber, Email [Line 2]: [Line 3]: 1, Jim, 1978-02-01, 555-23-256, jim.doe@donotreply.com [Line 4]: 2, Mia, 1985-12-21, 555-23-876, mia@donotreply.com [Line 5]: 3, Wil, 1962-05-07,
[Line 1]: ID, Name, Birthday, Phonenumber, Email
[Line 2]:
[Line 3]: 1, Jim, 1978-02-01, 555-23-256, jim.doe@donotreply.com
[Line 4]: 2, Mia, 1985-12-21, 555-23-876, mia@donotreply.com
[Line 5]: 3, Wil, 1962-05-07, 555-23-456, wil.doe@donotreply.com
现在我正试着围绕这个问题来思考:如何使用PHP解析此文件以获得以下数组
$people = array(
[1] = array(
[Name] => "Jim",
[Birthday] => "1978-02-01",
[Phonenumber] = "555-23-256",
[Email] => "jim.doe@donotreply.com",
),
...
);
有什么想法吗 使用fopen
和fgetcsv
为了做到这一点,您需要首先编写一个函数,用于从CSV检索数据并将其存储在变量中,下面的函数将使用
首先,您需要一个函数来读取CSV:
function utf8_fopen_read($fileName) {
$fc = iconv('windows-1250', 'utf-8//IGNORE', file_get_contents($fileName));
$handle = fopen("php://memory", "rw");
fwrite($handle, $fc);
fseek($handle, 0);
return $handle;
}
$people = [];
if(($handle = utf8_fopen_read('path/to/csv.csv')) !== FALSE) {
while(($data = fgetcsv($handle, 0, ',')) !== FALSE) {
$people[$i] = [];
for($c = 0; $c < count($data); $c++) {
$info = $data[$c];
if($i == 0) $fields[$c] = str_replace(' ', '', $info);
if($i > 0) $people[$ii][$fields[$c]] = $info;
}
if($i > 0) $ii++;
$i++;
}
fclose($handle);
}
完成此操作后,您需要操作刚刚检索到的数据,以便创建结果的多维数组,并将数据填充到关联键中,如您在问题中所述 现在我们将调用上面的函数,并将结果存储在
$data
中,使用循环我们将迭代整个CSV,并将所有信息逐行存储到$people
中
填充数组:
function utf8_fopen_read($fileName) {
$fc = iconv('windows-1250', 'utf-8//IGNORE', file_get_contents($fileName));
$handle = fopen("php://memory", "rw");
fwrite($handle, $fc);
fseek($handle, 0);
return $handle;
}
$people = [];
if(($handle = utf8_fopen_read('path/to/csv.csv')) !== FALSE) {
while(($data = fgetcsv($handle, 0, ',')) !== FALSE) {
$people[$i] = [];
for($c = 0; $c < count($data); $c++) {
$info = $data[$c];
if($i == 0) $fields[$c] = str_replace(' ', '', $info);
if($i > 0) $people[$ii][$fields[$c]] = $info;
}
if($i > 0) $ii++;
$i++;
}
fclose($handle);
}
$people=[];
if($handle=utf8\u fopen\u read('path/to/csv.csv'))!==FALSE){
while(($data=fgetcsv($handle,0,,'))!==FALSE){
$people[$i]=[];
对于($c=0;$c0)$people[$ii][$fields[$c]]]=$info;
}
如果($i>0)$ii++;
$i++;
}
fclose($handle);
}
谢谢。我知道如何打开该文件,并且可以使用fgetcsv读取该文件。我的问题是如何利用这种混乱:)你有这样的数据数组吗?它看起来像[身份证,姓名,生日,电话号码,电子邮件','',1,吉姆,1978-02-01555-23-256,吉姆。doe@donotreply.com“]?是的,我有……:)谁说这里需要任何类型的字符编码转换?使用array\u combine
@CBroe可以更简洁地处理带有正确键的行数组。我将使用array\u combine
@AksenP进行建议的编辑。您得到了什么结果?@AksenP输出与确切的示例相匹配由OP提供,你能更具体一点吗?