文本缩进到多级数组?

时间:2013-03-08 15:32:19

标签: php

我正在努力建立一个解析器,它应该将文本缩进(TAB KEY)转换为多级php数组(我对编程很新)

我有一个使用以下格式编写的txt文件:

test1
    test2
        blah3
    blah4
    blah5
        more content
some more
    and more content

解析后应返回如下数组:

$myarray[0]['c']                   = "test1";
$myarray[0]['s'][0]['c']           = "test2";
$myarray[0]['s'][0]['s'][0]['c']   = "blah3";
$myarray[0]['s'][1]['c']           = "blah4";
$myarray[0]['s'][2]['c']           = "blah5";
$myarray[0]['s'][2]['s'][0]['c']   = "more content";
$myarray[1]['c']                   = "some more";
$myarray[1]['s'][0]['c']           = "and more content";

可以在php中构建这样的功能吗?

之前你问我不能使用xml,因为我已经有了那个txt文件 必须首先转换为xml

非常感谢您的回答

1 个答案:

答案 0 :(得分:0)

当然你可以编写这样的解析器。您要做的实际上是构建一个树数据结构,该结构存储为一个数组数组,其中叶节点是文本值,分支由TAB确定。

您需要做的是:

  • 逐行阅读输入文本文件
  • 使用变量来保持当前缩进
  • 对于每一行,确定前导标签的数量(缩进)
  • 如果缩进与上一行的缩进匹配,则将该行的其余文本添加为​​当前数组的兄弟
  • 如果它比当前缩进大1,则添加分支(另一个子阵列)
  • 它小于当前缩进,相应地设置当前数组

如果您需要对这些步骤进行更多说明,请告诉我。

<强>更新

以下是一些指示。

您可以逐行读取文件:

$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
   $line = fgets($file_handle);

   // process line here

}
fclose($file_handle);

您可以使用以下代码检测每行中前导TAB的数量:

$numTabs = 0;
while(substr($line, $numTabs, 1) == "\t")
{
    $numTabs++;
}

然后使用对substr的另一个调用获取该行的其余部分:

$lineValue = substr($line, $numTabs);

要测试一行是否为空,您可以使用trim

if(trim($line) == ""){
   // line is blank.. just skip it!
}