【问题标题】:Remap CSV as an array using first row as keys使用第一行作为键将 CSV 重新映射为数组
【发布时间】:2020-02-21 12:36:59
【问题描述】:

假设我有一个 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",
       ),

...

);

有什么想法吗?

【问题讨论】:

  • 谢谢。我知道如何打开文件并且可以使用 fgetcsv 读取它。我的问题是如何解决这个烂摊子:)
  • 你有这个数据的数组吗?看起来像['ID, Name, Birthday, Phonenumber, Email', '', '1, Jim, 1978-02-01, 555-23-256, jim.doe@donotreply.com']?
  • 是的,我愿意... :)

标签: php arrays csv sorting


【解决方案1】:

使用fopen 和fgetcsv

为此,您需要先编写一个函数,用于从 CSV 中检索数据并将其存储在变量中,下面的函数将使用 fopen 完成此操作。

首先,您需要一个函数来读取 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;

}

完成此操作后,您将需要操作刚刚检索到的数据,以便创建结果的多维数组,将数据填充到您在问题中描述的关联键中。

现在我们将调用上述函数并将结果存储在$data 中,使用while 循环我们将遍历整个CSV 并将所有信息存储到$people 行按行。


填充您的数组:

$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);

}

【讨论】:

  • 谁说这里需要任何类型的字符编码转换?
  • 使用array_combine 可以更简洁地处理具有适当键的一行的数组。
  • @CBroe 我将使用array_combine进行建议的编辑
  • @AksenP 你得到了什么结果?
  • @AksenP 输出与 OP 提供的确切示例匹配,您能更具体一点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2013-11-03
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多