PHP .txt到数组制表符分隔

时间:2018-03-02 07:58:54

标签: php arrays tabs

你好。我有这个代码:

getMap

,我的数组列出如下:

public function parse_reports($filename)
{    
    $result = array();
    $fp = fopen($filename, "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);
    return $result; //return result
}

我需要的是数组编号采用VNUM编号,例如如下所示:

Array
( //test array1
    [0] => Array
        ( //array 0
            [VNUM] => 1
            [LOCALE_NAME] => Yang
        )

    [1] => Array
        ( //array 1
            [VNUM] => 2
            [LOCALE_NAME] => Ελληνική Έκδοση
        )

    [2] => Array
        ( //array 2
            [VNUM] => 10
            [LOCALE_NAME] => Σπαθί+0
        )

    [3] => Array
        ( //array 3
            [VNUM] => 11
            [LOCALE_NAME] => Σπαθί+1
        )

你可以看到我需要的是用我的.txt标题所具有的VNUM更改数组ID ...如果有人可以帮助我,我将非常高兴!谢谢! 如果您需要更多详细信息,请随时向我询问

感谢Eddie

2 个答案:

答案 0 :(得分:0)

您可以使用array_reduce

注意:我必须使用implodeexplode,因为文本文件中有隐藏/特殊字符。

像:

public function parse_reports($filename)
{    
    $result = array();
    $fp = fopen($filename, "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);

    //To use the VNUM as the key
    $result = array_reduce($result,function($c,$v){
        $val = explode( ",", implode( ",", $v ));
        $c[ $val[0] ] = $v;
        return $c;
    }, array());

    return $result;
}

获得此结果

Array
(
    [1] => Array
        (
            [VNUM] => 1
            [LOCALE_NAME] => Yang
        )

    [2] => Array
        (
            [VNUM] => 2
            [LOCALE_NAME] => Ελληνική Έκδοση
        )

    [10] => Array
        (
            [VNUM] => 10
            [LOCALE_NAME] => Σπαθί+0
        )

    [11] => Array
        (
            [VNUM] => 11
            [LOCALE_NAME] => Σπαθί+1
        )

    [12] => Array
        (
            [VNUM] => 12
            [LOCALE_NAME] => Σπαθί+2
        )

    [13] => Array
        (
            [VNUM] => 13
            [LOCALE_NAME] => Σπαθί+3
        )
......

Doc:http://php.net/manual/en/function.array-reduce.php

答案 1 :(得分:0)

您可以使用array_column()之类的...

return array_column ($result, null, 'VNUM'); //return result

这使用VNUM列作为数组的索引。

<强>更新 您的列标题可能包含空格,因此array_column()无法正常工作,但如果您尝试...

public function parse_reports($filename)
{    
    $result = array();
    $fp = fopen($filename, "r");
    if (($headers = fgetcsv($fp, 0, "\t")) !== FALSE)
      if ($headers)
        $headers = array_map("trim", $headers );
        while (($line = fgetcsv($fp, 0, "\t")) !== FALSE) 
          if ($line)
            if (sizeof($line)==sizeof($headers))
              $result[] = array_combine($headers,$line);
    fclose($fp);
    return array_column ($result, null, 'VNUM'); //return result
}

这将清除array_map()来电中的任何标头值。

更新(2):

看起来好像标题有些奇怪 - 最后一次尝试......

return array_column($result, null, $headers[0]);

示例数据......

VNUM    LOCALE_NAME
1   Yang
2   Ελληνική Έκδοση
10  Σπαθί+0
11  Σπαθί+1
12  Σπαθί+2
13  Σπαθί+3
14  Σπαθί+4
15  Σπαθί+5
16  Σπαθί+6
17  Σπαθί+7
18  Σπαθί+8
19  Σπαθί+9