0

テキストのインデント (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を使用できません

ご回答ありがとうございます。

4

1 に答える 1

0

もちろん、そのようなパーサーを書くこともできます。あなたがやろうとしているのは、実際には、リーフノードがテキスト値であり、ブランチがTABによって決定される配列の配列として格納されるツリーデータ構造を構築することです。

あなたがする必要があるのは:

  • 入力テキストファイルを1行ずつ読み取ります
  • 変数を使用して現在のインデントを維持する
  • 行ごとに、先頭のタブの数を決定します(インデント)
  • インデントが前の行のインデントと一致する場合は、その行の残りのテキストを兄弟として現在の配列に追加します
  • 1-現在のインデントよりも大きい場合は、ブランチ(別のサブ配列)を追加します
  • 現在のインデントよりも小さい場合は、それに応じて現在の配列を設定します

これらの手順のいずれかについてさらに説明が必要な場合は、Peaseからお知らせください。

アップデート

ここにいくつかのポインタがあります。

次のようなファイルを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!
}
于 2013-03-08T15:37:14.330 に答える