读取文件并创建第一行的数组作为标题(键)

时间:2015-04-28 16:00:39

标签: php arrays file

我可以读取文件并将其放入数组中。

file.txt的:

 time          value1         value2    

    .00          .0000        21.2310         
 100.92       200.2272         7.7243         
 200.92       222.4021         8.6395 

我目前的代码:

$array = file('file.txt');
$new_array = array();

foreach ($array as $line) {
    $string = preg_replace('/\s+/',';', $line);    
    $line_array = explode("\t", $string);
    $new_array[] = $line_array[0];
}

我的输出:

    array
  'time' => 
    array
      0 => string '.00' 
      1 => string '267.1081'  
      2 => string '267.1043'  
  'value1' => 
    array
      0 => string '100.92'  
      1 => string ' 200.2272' 
      2 => string '7.7243'  
  'value2' => 
    array
      0 => string '200.92'  
      1 => string '222.4021'  
      2 => string '8.6395'  

但我的愿望是:

    $my_array = Array
(
    [0] => Array
        (
            [time] =>  .00 
            [value1] => .0000 
            [value2] => 21.2310  
        )

    [1] => Array
        (
            [time] =>  100.92 
            [value1] => 200.2272  
            [value2] => 7.7243   
        )

     [2] => Array
        (
            [time] =>   200.92 
            [value1] => 222.4021
            [value2] => 8.6395   
        )

)

如何将第一行作为其他值的键?

1 个答案:

答案 0 :(得分:3)

这应该适合你:

这里我首先将文件放入一个带file()的数组中,其中每一行都是一个数组元素。在那里,我忽略每行末尾的新行字符并跳过空行。

在此之后,我使用array_map()遍历每一行,并用preg_split()将其拆分1个或多个空格。在我返回之前,我使用array_filter()删除空元素。

然后我使用array_shift()将第一个innerArray作为$header

最后,我再次浏览所有innerArrays并array_combine()  $header数组的值。

<?php

    $lines = file("file.txt", FILE_IGNORE_NEW_LINES |FILE_SKIP_EMPTY_LINES);

    $data = array_map(function($v){
        return array_filter(preg_split("/\s+/", $v));
    }, $lines);

    $header = array_shift($data);

    $data = array_map(function($v)use($header){
        return array_combine($header, $v);
    }, $data);

    print_r($data);

?>

输出:

Array
(
    [0] => Array
        (
            [time] => .00
            [value1] => .0000
            [value2] => 21.2310
        )

    [1] => Array
        (
            [time] => 100.92
            [value1] => 200.2272
            [value2] => 7.7243
        )

    [2] => Array
        (
            [time] => 200.92
            [value1] => 222.4021
            [value2] => 8.6395
        )

)