2017-05-19 1 views
0

J'ai un document texte au format hiérarchique pouvant contenir jusqu'à 6 niveaux.Construction d'un tableau imbriqué

.step1 -- step 1. text 
..step2 -- step 1. A. text 
..step2 -- step 1. B. text 
..step2 -- step 1. C. text 
..step2 -- step 1. D. text 
..step2 -- step 1. E. text 
.step1 -- step 2. text 
..step2 -- step 2. A. text 
...step3 -- step 2. A. (1) text 
...step3 -- step 2. A. (2) text 
.step1 -- step 3. text 

Je l'analyse du document texte avec regex et la construction d'un tableau qui est structuré comme celui-ci

$contentsArray structure 
    'level' INT - the step level 
    'type' STRING - the type of tag, note, warning, step1, step2 
    'line' INT - the line number in the file 
    'text' STRING - the text 

------ SAMPLE ARRAY ------- 

    [0] => Array 
    (
     [level] => 1 
     [type] => step1 
     [line] => 8 
     [text] => Step 1. text 
    ) 

[1] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 10 
     [text] => Step 1. A. text 
    ) 

[2] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 12 
     [text] => Step 1.B. text 
    ) 

[3] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 14 
     [text] => Step 1. C. text. 
    ) 

[4] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 16 
     [text] => Step 1. D. text. 
    ) 

[5] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 18 
     [text] => Step 1. E. text. 
    ) 

[6] => Array 
    (
     [level] => 1 
     [type] => step1 
     [line] => 20 
     [text] => Step 2. text 
    ) 

[7] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 22 
     [text] => Step 2. A. Text. 
    ) 

[8] => Array 
    (
     [level] => 3 
     [type] => step3 
     [line] => 26 
     [text] => Step 2. A. (1) Text. 
    ) 

[9] => Array 
    (
     [level] => 3 
     [type] => step3 
     [line] => 28 
     [text] => Step 3. A. (2) Text. 
    ) 

[10] => Array 
    (
     [level] => 1 
     [type] => step1 
     [line] => 30 
     [text] => Step 3. Text 
    ) 

L'objectif final est de transformer cela en un document XML imbriqué. Je pense que ce dont j'ai besoin est de construire un tableau imbriqué que je peux ensuite convertir en XML. Je pense que la structure de ce tableau serait quelque chose comme

[0] => Array 
     (
      [level] => 1 
      [type] => step1 
      [line] => 8 
      [text] => Step 1. text 
     ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 10 
       [text] => Step 1. A. text 
      ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 12 
       [text] => Step 1.B. text 
      ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 14 
       [text] => Step 1. C. text. 
      ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 16 
       [text] => Step 1. D. text. 
      ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 18 
       [text] => Step 1. E. text. 
      ) 
     ) 
    [1] => Array 
     (
      [level] => 1 
      [type] => step1 
      [line] => 20 
      [text] => Step 2. text 
     , Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 22 
       [text] => Step 2. A. Text. 
       , Array 
       (
        [level] => 3 
        [type] => step3 
        [line] => 26 
        [text] => Step 2. A. (1) Text. 
       ), Array 
       (
        [level] => 3 
        [type] => step3 
        [line] => 28 
        [text] => Step 3. A. (2) Text. 
       ) 
      ) 
     ) 

    [2] => Array 
     (
      [level] => 1 
      [type] => step1 
      [line] => 30 
      [text] => Step 3. Text 
     ) 

Ce que je besoin est une aide sur une méthode en boucle à travers le réseau que j'ai construit et utiliser la valeur level pour comprendre l'imbrication dans le tableau finale . Mes tentatives ont été plutôt infructueuses jusqu'à maintenant. J'ai l'impression qu'il existe une façon récursive ou itérative de le faire, mais ce n'est pas mon fort.

Merci pour l'aide et j'espère que cette question est assez claire.

MISE À JOUR LA QUESTION Je vois que j'ai fait un très mauvais travail en posant la question, j'ai donc fait quelques modifications.

+0

Si vous utilisez PHP, vous devez étiqueter la question avec la balise 'php' – alfasin

+0

Je le fais en PHP mais pour moi c'est plus une question technique. –

+0

Vous décrivez un tableau associatif avec 4 propriétés, mais où se trouve la partie "texte" dans votre entrée, et comment votre tableau a-t-il juste une propriété "texte" et pas les 3 autres? – trincot

Répondre

1

Votre exemple n'est pas cohérent. En supposant que la dernière ...step3 est une erreur, cela fera ce que vous voulez. C'est en perl, mais devrait facilement traduire. Il utilise une pile simple et des changements de niveau de traitement par rapport à la taille de pile actuelle.

Je vais vous laisser travailler l'indentation. Vous pouvez le faire en fonction de la taille de la pile, aussi.

Addition

Eh bien, vous avez changé la question un peu. Mais l'approche de base de l'utilisation d'une pile et des changements de niveau de traitement par rapport à la longueur de la pile fonctionnera toujours correctement.

1

est ici mise en œuvre de PHP lorsque vous avez le texte d'entrée dans une $input variable:

$stack = []; 
foreach(explode("\n", $input . "\n.") as $line) { 
    $line = trim($line); 
    $type = ltrim($line, "."); 
    $dots = strlen($line) - strlen($type); 
    if (!$dots || $dots > count($stack) + 1) throw new Exception("Bad input format"); 
    while($dots <= count($stack)) 
     $xml[] = str_repeat(" ", count($stack)-1) . array_pop($stack); 
    $xml[] = str_repeat(" ", count($stack)) . "<$type>"; 
    $stack[] = "</$type>"; 
} 
$xml = implode("\n", array_slice($xml, 0, -1)); 
echo $xml; 

Voir courir sur eval.in.