Concatenate hierarchy

2

I have the following code:

<?php
function obterID($string) {
    $res = preg_match('~id="([\w]+)"~i', $string, $IDs);
    if ($res){
        return $IDs[1];
    } else {
        return "";
    }      
} 

// Lê conteúdo do txt
$documento = '<ul id="titulo1" class="titulo">
   <li>
      <p>TÍTULO I</p>
   </li>
</ul>
<ul id="artigo1" class="artigo">
   <li>
      <p>Art. 1º...</p>
   </li>
</ul>
<ul id="artigo2" class="artigo">
   <li>
      <p>Art. 2º ....</p>
   </li>
</ul>
<ul id="artigo3" class="artigo">
   <li>
      <p>Art. 3º ....:</p>
   </li>
</ul>
<ul id="artigo4" class="artigo">
   <li>
      <p>Art. 4º ....:</p>
   </li>
</ul>
<ul id="titulo2" class="titulo">
   <li>
      <p>TÍTULO II</p>
   </li>
</ul>
<ul id="capitulo1" class="capitulo">
   <li>
      <p>CAPÍTULO I</p>
   </li>
</ul>
<ul id="artigo5" class="artigo">
   <li>
      <p>Art. 5º ....:</p>
   </li>
</ul>
<ul id="capitulo2" class="capitulo">
   <li>
      <p>CAPÍTULO II</p>
   </li>
</ul>
<ul id="artigo6" class="artigo">
   <li>
      <p>Art. 6º ...</p>
   </li>
</ul>
<ul id="artigo7" class="artigo">
   <li>
      <p>Art. 7º ...</p>
   </li>

</ul>
<ul id="artigo8" class="artigo">
   <li>
      <p>Art. 8º....:</p>
   </li>
</ul>
<ul id="artigo9" class="artigo">
   <li>
      <p>Art. 9º É as.</p>
   </li>
</ul>
<ul id="artigo10" class="artigo">
   <li>
      <p>Art. 10. ....</p>
   </li>
</ul>
<ul id="artigo11" class="artigo">
   <li>
      <p>Art. 11. ....</p>
   </li>
</ul>
<ul id="capitulo3" class="capitulo">
   <li>
      <p>CAPÍTULO III</p>
   </li>
</ul>
<ul id="artigo12" class="artigo">
   <li>
      <p>Art. 12. São brasileiros:</p>
   </li>
</ul>';

$linhas = explode("<ul", $documento);

$novalinhas = "";
$concatenaTitulo = "";

foreach ($linhas as $novalinha){


$novoTituloSlug = ObterID($novalinha);
if (empty($novoTituloSlug))
    continue;

$concatenaTitulo .= $novoTituloSlug;  
}

echo $concatenaTitulo;
?>

DEMO

I would like to concatenate by hierarchy, as in a breadcrumb (but, I do not know how to make a breadcrumb ).

This is the result I would like in every foreach :

titulo1
titulo1artigo1
titulo1artigo2
titulo1artigo3
titulo2
titulo2capitulo1
titulo2capitulo1artigo5
titulo2capitulo2
titulo2capitulo7artigo6

But it only concatenates, without replacing:

titulo1
titulo1artigo1
titulo1artigo1artigo2
titulo1artigo1artigo2artigo3

And it goes to:

titulo1artigo1artigo2artigo3artigo4titulo2capitulo1artigo5capitulo2artigo6artigo7artigo8artigo9artigo10artigo11capitulo3artigo12
    
asked by anonymous 30.04.2015 / 22:52

1 answer

2

You can filter this information by title , article or chapter ) and place them in array associative .

Use the function below instead of the obterID function:

function retornarInfo($texto, $classe) {
    $expressao = '~id="([\w]+)" class="'. $classe .'"~i';
    $casamento = preg_match($expressao, $texto, $resultado);
    return (($casamento == 1 ? $resultado[1] : ""));      
}

To create the hierarchy, use the function below:

function criarHierarquia($linhas){
    $informacoes = [];
    $indiceTitulo = $indiceCapitulo = "";
    foreach ($linhas as $linha){
        $titulo   = retornarInfo($linha, "titulo");
        $capitulo = retornarInfo($linha, "capitulo");
        $artigo   = retornarInfo($linha, "artigo");

        if (!empty($titulo))
            $indiceTitulo = $titulo;
        if (!empty($capitulo)){
            $indiceCapitulo = $capitulo;
        } elseif (!empty($artigo)){
            if (!empty($indiceCapitulo))
                $informacoes["titulo"][$indiceTitulo]["artigo"][$indiceCapitulo][] = $artigo;
            else
                $informacoes["titulo"][$indiceTitulo]["artigo"][] = $artigo;
        }
    }
    return $informacoes;
}

Example of use:

$linhas = explode("<ul", $documento);
$informacoes = criarHierarquia($linhas);

Scroll the array informacoes as follows:

foreach ($informacoes as $info){
    foreach ($info as $titulo => $artigos){
        echo "{$titulo}<br>";
        foreach ($artigos as $artigo){
            foreach ($artigo as $capitulo => $subArtigo){
                if (is_array($subArtigo)){
                    foreach($subArtigo as $capArtigo){
                        echo "{$titulo}{$capitulo}{$capArtigo}<br>";
                    }                   
                } else {
                    echo "{$titulo}{$subArtigo}<br>";
                }
            }
        }
    }
}

To display the array hierarchy do:

echo "<pre>", print_r($informacoes, 1), "<pre>";

- DEMO

    
30.04.2015 / 23:50