代码之家  ›  专栏  ›  技术社区  ›  zekephp

PHP。txt到数组制表符分隔

  •  -1
  • zekephp  · 技术社区  · 6 年前

    你好我有以下代码:

    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
    }
    

    我的数组列表如下:

    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
            )
    

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

    Array
    (
        [1] => Array
            (
                [VNUM] => 1 //this take the value of VNUM
                [LOCALE_NAME] => Yang
            )
    
        [2] => Array
            (
                [VNUM] => 2 //this take the value of VNUM
                [LOCALE_NAME] => Ελληνική Έκδοση
            )
    
        [10] => Array //this take the value of VNUM
            (
                [VNUM] => 10 //this take the value of VNUM
                [LOCALE_NAME] => Σπαθί+0
            )
    
        [11] => Array
            (
                [VNUM] => 11 //this take the value of VNUM
                [LOCALE_NAME] => Σπαθί+1
            )
    

    正如您所看到的,我需要的是使用我的VNUM更改数组id。txt标题有。。。如果有人能帮我,我会很高兴的!非常感谢。 如果你需要更多的细节,请随时问我

    多亏了Eddie

    2 回复  |  直到 6 年前
        1
  •  0
  •   Eddie    6 年前

    您可以使用 array_reduce

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

    例如:

    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
            )
    ......
    

    文件编号: http://php.net/manual/en/function.array-reduce.php

        2
  •  0
  •   Nigel Ren    6 年前

    你可以使用 array_column() 喜欢

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

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

    更新: 您的列标题可能包含空格,因此 array\u列() 不会像现在这样工作,但如果你尝试。。。

    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