2016-03-25 12 views
0

Ich brauche ein wenig Hilfe beim Aufteilen des Inhalts einer Datei in ein multidimensionales Array.php spaltet eine Datei in ein multidimensionales Array

Beispiel der Dateiinhalte:

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

Ich brauche diese Datei zu lesen und teilen Sie es in ein Array mit der folgenden Struktur:

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' 
    ) 
) 

I file_get_contents bin mit() zu lesen, die Inhalt der Datei in eine Zeichenfolge. Ich verwende preg_match_all(), um meine definierten Array-Schlüssel herauszuziehen. Im Folgenden sind die Regex, die ich benutze:

$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'; 

Ich kann den Schlüssel herausziehen erfolgreich, und ich kann die Datei in spezifische Elemente trennen, aber ich habe Schwierigkeiten, wenn ich meine Array zu erstellen. Jede Hilfe würde sehr geschätzt werden. Vielen Dank im Voraus.

+3

Zeile für Zeile mit 'while ($ line = fgets ($ file))' lesen anstatt das Ganze mit 'file_get_contents()' zu lesen. – Barmar

+0

Sind diese "Ziel" -Tasten "Single" und "Multi" statisch (konstant) innerhalb Ihres Dateiinhalts? – RomanPerekhrest

+0

Ja, "Single" und "Multi" sind statisch. alles andere ist nicht. Der 'Makrocode' wird in der Länge variieren. Das bedeutet, dass jeder 'Makrocode' eine andere Anzahl von Zeilen abdeckt. –

Antwort

2

Wie Barmar sagte, sollten Sie Zeile für Zeile mit fgets statt file_get_contents durchgehen.

Hier ist ein Beispielskript, das das tut, was Sie gefragt haben. Sie werden es wahrscheinlich mit einer zusätzlichen Validierung und ähnlichem erweitern wollen.

<?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); 
Verwandte Themen