Php 使用第一行作为键将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,

假设我有一个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, 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提供,你能更具体一点吗?