Как создать структурированный массив из файла Tabdelimited с помощью PHP? - PullRequest
8 голосов
/ 20 декабря 2011

У меня проблема с чтением файла с разделителями табуляции.

Структура в моем файле:

Field 1     Field 2     Field 3
Element11   Element12   Element13
Element21   Element22   Element23
Element31   Element32   Element33

Из этого файла я хочу создать массив с такой структурой:

$csv = array(
            array(  'Field 1' => 'Element11',
                    'Field 2' => 'Element12',
                    'Field 3' => 'Element13',

            ),
            array(  'Field 1' => 'Element21',
                    'Field 2' => 'Element22',
                    'Field 3' => 'Element23',

            ),
            array(  'Field 1' => 'Element31',
                    'Field 2' => 'Element32',
                    'Field 3' => 'Element33',

            )    
        );

Как я могу это сделать?

Ответы [ 2 ]

16 голосов
/ 20 декабря 2011

Чтобы получить заголовки в качестве ключей массива, вам нужно

$result = array();
$fp = fopen('/path/to/file','r');
if (($headers = fgetcsv($fp, 0, "\t")) !== FALSE)
  if ($headers)
    while (($line = fgetcsv($fp, 0, "\t")) !== FALSE) 
      if ($line)
        if (sizeof($line)==sizeof($headers))
          $result[] = array_combine($headers,$line);
fclose($fp);
print_r($result);
2 голосов
/ 20 декабря 2011

fgetcsv() * * 1004

$result = array();
$fp = fopen('/path/to/file','r');
while (($line = fgetcsv($fp, 0, "\t")) !== FALSE) if ($line) $result[] = $line;
fclose($fp);

print_r($result);

Если вы хотите пропустить строку заголовка, просто наберите fgets() один раз, прежде чем войти в цикл. Или, если вы хотите, чтобы массив был ассоциативным, как показано выше:

$result = array();
$fp = fopen('/path/to/file','r');
$headers = fgetcsv($fp, 0, "\t");
$row = 0;
while (($line = fgetcsv($fp, 0, "\t")) !== FALSE) if ($line) {
  for ($col = 0; isset($line[$col]); $col++) {
    $result[$row][$header[$col]] = $line[$col];
  }
  $row++;
}
fclose($fp);

print_r($result);
...