PHP将文件解析为Array of Array

时间:2018-02-26 09:09:25

标签: php arrays parsing multidimensional-array

我有一个包含很多行的文件,每行都有以下格式: 1519382994.85#MSG#出了点问题

因此,对于每一行,我有三个字段除以#。数字,消息类型和字符串。

现在我想读取文件并拆分内容。 我这样做了:

//Opening the logger file
$myfile = file_get_contents("operations.txt", "r") or die("Unable to open file!");
$rows = explode("\n", $myfile);
$num_rows = count($rows);
$fieldList = array();
//Parsing rows using '#'
foreach ($rows as $row => $data) {
    $row_data = explode('#', $data);
    array_push($fieldList, (string)$row_data[0]);
    array_push($fieldList, (string)$row_data[1]);
    array_push($fieldList, (string)$row_data[2]);
}

代码运行良好,但我希望有一个数组数组和这种数据:

0: Array [ "112323.76", "MSG", "Hello"]
1: Array [ "453435.78", "MSG", "Bye"] etc..

我尝试使用此代码,但我做错了。

  $last=0;
 $result = array();
        for ($i = 0; $i < $num_rows; $i++) {
        array_push($result, (string) $fieldList[$last], (string) $fieldList[$last+1],(string) $fieldList[$last+2]);
        //echo $fieldList[$last].'<br>';
        //echo $fieldList[$last+1].'<br>';
        //echo $fieldList[$last+2].'<br>';
        $last=$last+3;
        }

我是PHP的新手有人可以帮助我,告诉我我做错了什么? Tanx很多你的时间

2 个答案:

答案 0 :(得分:3)

您可以使用内置的fgetcsv

array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = "," [, string $enclosure = '"' [, string $escape = "\\" ]]]] )

这可能看起来像:

$rows = [];
if (false !== ($handle = fopen("path/to/file", "r"))) 
{
    while (false !== ($row = fgetcsv($handle, 1000, ",")))
    {
        array_push($rows, $row);
    }
    fclose($handle);
}

不知道它是否会快得多,但对我来说看起来容易多了。相对于file()explode(),这样做的主要好处是:

  1. 不需要一次将整个文件放在RAM中,处理可以一次完成一行。
  2. 很容易支持其他&#34; C 字符 S 运行 V alues&#34;输入可以引用字段的文件($enclosure

答案 1 :(得分:1)

只需在代码中进行一些修改即可。为修改后的行添加了注释 -

$myfile = file_get_contents("operations.txt", "r") or die("Unable to open file!");
$rows = explode("\n", $myfile);
$num_rows = count($rows);
$finalFieldList = array(); // new array
//Parsing rows using '#'
foreach ($rows as $row => $data) {
    $fieldList = array(); // temporary array
    $row_data = explode('#', $data);
    array_push($fieldList, (string)$row_data[0]);
    array_push($fieldList, (string)$row_data[1]);
    array_push($fieldList, (string)$row_data[2]);

    array_push($finalFieldList, $fieldList); // it will push to final array containing all 3 values
}