2016-03-25 18 views
0

ファイルの内容を多次元配列に分割するのに少し助けが必要です。ファイルの内容のファイルを多次元配列に分割する

サンプル:

--[DEATH KNIGHT]-- 
--|Blood|-- 
--{Single}-- 
/* MACRO CODE FOR SINGLE TARGET */ 
--{MULTI}-- 
/* MACRO CODE FOR MULTIPLE TARGETS */ 
--|Frost|-- 
/* MACRO CODE FOR SINGLE TARGET */ 
--{MULTI}-- 
/* MACRO CODE FOR MULTIPLE TARGETS */ 
--{Single}-- 
--[DRUID]-- 
--|Guardian|-- 
--{Single}-- 
/* MACRO CODE FOR SINGLE TARGET */ 
--{Multi}-- 
/* MACRO CODE FOR MULTIPLE TARGETS */ 

私はこのファイルを読み込む必要があり、以下の構造を持つ配列に分割:

array(
    'DEATHKNIGHT' => array(
    'Blood' => array(
     'Single' = 'Single Target Macro Code', 
     'Multi' = 'Multiple Target Macro Code' 
    ), 
    'Frost' => array(
     'Single' = 'Single Target Macro Code', 
     'Multi' = 'Multiple Target Macro Code' 
    ) 
), 
    'DRUID' => array(
    'Guardian' => array(
     'Single' = 'Single Target Macro Code', 
     'Multi' = 'Multiple Target Macro Code' 
    ) 
) 

私は読むために)(のfile_get_contentsを使用していますファイルの内容を文字列に変換します。私は私の定義された配列キーを引き出すためにpreg_match_all()を使用しています。以下は、私が使用しています正規表現です:

$class_regex = '/(?:-{2})(?:\[)(?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?(?:\])(?:-{2})/'; 
$spec_regex = '/(?:-{2})(?:\|)(?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?(?:\|)(?:-{2})/i'; 
$target_regex = '/(?:-{2})(?:\{)(?:[A-Z][\w]+)(?:[\s][\(][\d][\D][\)])?(?:\})(?:-{2})/i'; 

私は正常にキーを抜くことができ、私は特定の要素にファイルを区切ることができますが、私の配列を作成しようとしたとき、私は苦労しています。どんな助けでも大歓迎です。前もって感謝します。

+3

'file_get_contents()'で全体を読むのではなく、 'while($ line = fgets($ file))'で一行ずつ読みます。 – Barmar

+0

あなたのファイルの内容の中で、それらの 'ターゲット'キーは 'Single'と' Multi' static(定数)ですか? – RomanPerekhrest

+0

はい、 'シングル'と 'マルチ'は静的です。他のすべてはそうではありません。 「マクロコード」の長さは異なります。マクロコードごとに異なる量の行が含まれることを意味します。 –

答えて

2

Barmarのように、file_get_contentsの代わりにfgetsを使用して1行ずつ行かなければなりません。

ここでは、あなたが尋ねたことをするスクリプトの例を示します。余分な検証などでそれを拡張したいと思うでしょう。

<?php 
$parsed = array(); 
$handle = fopen("source.txt", "r"); 
if ($handle) { 
    while (($line = fgets($handle, 4096)) !== false) { 
     if (preg_match('/^--\[((?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?)\]--$/', $line, $match)) { 
      $class = $match[1]; 
     } elseif (preg_match('/^--\|((?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?)\|--$/', $line, $match)) { 
      $spec = $match[1]; 
     } elseif (preg_match('/^--\{((?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?)\}--$/', $line, $match)) { 
      $target = $match[1]; 
     } else { 
      if (isset($class) && isset($spec) && isset($target)) { 
       if (empty($parsed[$class])) { 
        $parsed[$class] = array(); 
       } 
       if (empty($parsed[$class][$spec])) { 
        $parsed[$class][$spec] = array(); 
       } 
       if (empty($parsed[$class][$spec][$target])) { 
        $parsed[$class][$spec][$target] = ''; 
       } 
       $parsed[$class][$spec][$target] .= $line; 
      } 
     } 
    } 
    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 
    fclose($handle); 
} 
echo print_r($parsed);