2016-03-25 7 views
0

Мне нужна небольшая помощь при разбиении содержимого файла на многомерный массив.php разделение файла на многомерный массив

Пример содержимого файла:

--[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

Прочитайте его по строке с помощью 'while ($ line = fgets ($ file))' вместо того, чтобы читать всю вещь с помощью 'file_get_contents()'. – Barmar

+0

Являются ли эти целевые ключи «Single» и «Multi» статическими (постоянными) в вашем файле? – RomanPerekhrest

+0

Да, «Single» и «Multi» являются статическими. все остальное - нет. «Макро-код» будет меняться по длине. Это означает, что каждый «макрокод» будет охватывать другое количество строк. –

ответ

2

Как и Бармар сказал, что вам следует пройти через линию, используя fgets вместо file_get_contents.

Вот пример скрипта, который делает то, что вы просили. Вероятно, вы захотите расширить его с помощью дополнительной проверки и т. Д.

<?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); 
Смежные вопросы