PHP .txt到数组制表符分隔

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP .txt到数组制表符分隔相关的知识,希望对你有一定的参考价值。

你好。我有这个代码:

public function parse_reports($filename)
{    
    $result = array();
    $fp = fopen($filename, "r");
    if (($headers = fgetcsv($fp, 0, "	")) !== FALSE)
      if ($headers)
        while (($line = fgetcsv($fp, 0, "	")) !== 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
        )

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

感谢Eddie

答案

你可以使用array_reduce

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

喜欢:

public function parse_reports($filename)
{    
    $result = array();
    $fp = fopen($filename, "r");
    if (($headers = fgetcsv($fp, 0, "	")) !== FALSE)
      if ($headers)
        while (($line = fgetcsv($fp, 0, "	")) !== 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

另一答案

你可以使用像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, "	")) !== FALSE)
      if ($headers)
        $headers = array_map("trim", $headers );
        while (($line = fgetcsv($fp, 0, "	")) !== 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

以上是关于PHP .txt到数组制表符分隔的主要内容,如果未能解决你的问题,请参考以下文章

无法将制表符分隔的 Txt 文件从 S3 加载到 Redshift

将制表符分隔的文本转换为数组[重复]

编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。(代码片段

使用带有预定义分隔符的 numpy 保存逐行 txt

使用 vbs 将 .xlsx 保存为制表符分隔的 .txt 文件

制表符分隔文本的复制粘贴会导致 Excel 中出现奇怪的格式?