Defined variable, but shows as undefined

Asked

Viewed 1,278 times

-1

I have the following code:

<?php

    // Lê conteúdo do txt
    $documento = 'TÍTULO I
    Dos Princípios Fundamentais

    Art. 1º A República Federativa do Brasil, formada pela união indissolúvel dos Estados e Municípios e do Distrito Federal, constitui-se em Estado Democrático de Direito e tem como fundamentos:

    I - a soberania;

    II - a cidadania

    III - a dignidade da pessoa humana;

    IV - os valores sociais do trabalho e da livre iniciativa;

    V - o pluralismo político.

    Parágrafo único. Todo o poder emana do povo, que o exerce por meio de representantes eleitos ou diretamente, nos termos desta Constituição.

    Art. 2º São Poderes da União, independentes e harmônicos entre si, o Legislativo, o Executivo e o Judiciário.

    Art. 3º Constituem objetivos fundamentais da República Federativa do Brasil:

    I - construir uma sociedade livre, justa e solidária;

    II - garantir o desenvolvimento nacional;

    III - erradicar a pobreza e a marginalização e reduzir as desigualdades sociais e regionais;

    IV - promover o bem de todos, sem preconceitos de origem, raça, sexo, cor, idade e quaisquer outras formas de discriminação.

    Art. 4º A República Federativa do Brasil rege-se nas suas relações internacionais pelos seguintes princípios:

    I - independência nacional;

    II - prevalência dos direitos humanos;

    III - autodeterminação dos povos;

    IV - não-intervenção;

    V - igualdade entre os Estados;

    VI - defesa da paz;

    VII - solução pacífica dos conflitos;

    VIII - repúdio ao terrorismo e ao racismo;

    IX - cooperação entre os povos para o progresso da humanidade;

    X - concessão de asilo político.

    Parágrafo único. A República Federativa do Brasil buscará a integração econômica, política, social e cultural dos povos da América Latina, visando à formação de uma comunidade latino-americana de nações.

    TÍTULO II
    Dos Direitos e Garantias Fundamentais
    CAPÍTULO I
    DOS DIREITOS E DEVERES INDIVIDUAIS E COLETIVOS

    Art. 5º Todos são iguais perante a lei, sem distinção de qualquer natureza, garantindo-se aos brasileiros e aos estrangeiros residentes no País a inviolabilidade do direito à vida, à liberdade, à igualdade, à segurança e à propriedade, nos termos seguintes:

    I - homens e mulheres são iguais em direitos e obrigações, nos termos desta Constituição;

    II - ninguém será obrigado a fazer ou deixar de fazer alguma coisa senão em virtude de lei;

    III - ninguém será submetido a tortura nem a tratamento desumano ou degradante;';


    function romano($romano) {
      switch (trim(strip_tags($romano))){
        case 'I':
          $romano = '1';
          break;
        case 'II':
          $romano = '2';
          break;
        case 'III':
          $romano = '3';
          break;  
        case 'IV':
          $romano = '4';
          break;
        case 'V':
          $romano = '5';
          break; 
        case 'VI':
          $romano = '6';
          break; 
        case 'VII':
          $romano = '7';
          break;
        case 'VIII':
          $romano = '8';
          break;
        case 'IX':
          $romano = '9';
          break;  
        case 'X':
          $romano = '10';
          break;   
        case 'XI':
          $romano = '11';
          break; 
        case 'XII':
          $romano = '12';
          break;     
        case 'XIII':
          $romano = '13';
          break;     
        case 'XIV':
          $romano = '14';
          break;  
        case 'XV':
          $romano = '15';
          break; 
        case 'XVI':
          $romano = '16';
          break; 
        case 'XVII':
          $romano = '17';
          break;     
        case 'XVIII':
          $romano = '18';
          break;     
        case 'XIX':
          $romano = '19';
          break;  
        case 'XX':
          $romano = '20';
          break;                                                
        case 'ÚNICO':
          $romano = '_unico';
          break;  
        case 'COMPLEMENTAR':
          $romano = '_complementar';
          break;
        case 'G':
          $romano = '_geral';
          break;  
        case 'E':
          $romano = '_especial';
          break;                                                                                                                                               
       default:
          $romano = '_especial';
      }
      return $romano;
    } 


    function concatena($concatenaHierarquia) {

        if ($contatenaParte = 1) {
          $concatenaHierarquia .= $valorParte;
        }
        if ($contatenaLivro = 1) {
          $concatenaHierarquia .= $valorLivro;
        }
        if ($contatenaTitulo = 1) {
          $concatenaHierarquia .= $valorTitulo;
        }
        if ($contatenaSubtitulo = 1) {
          $concatenaHierarquia .= $valorSubtitulo;
        }
        if ($contatenaCapitulo = 1) {
          $concatenaHierarquia .= $valorCapitulo;
        }
        if ($contatenaSecoes = 1) {
          $concatenaHierarquia .= $valorSecao;
        }
        if ($contatenaSubsecoes = 1) {
          $concatenaHierarquia .= $valorsubsecao;
        }
        if ($contatenaArtigos = 1) {
          $concatenaHierarquia .= $valorArtigo;
        }

        return $concatenaHierarquia;
    }

    // Variável das palavras chaves
    $encontraParte = "P A R T E";
    $encontraLivro = "LIVRO";
    $encontraTitulo = "TÍTULO";
    $encontraSubtitulo = "SUBTÍTULO";
    $encontraCapitulo = "CAPÍTULO";
    $encontraSecao = "Seção";
    $encontraSubsecao = "Subseção";
    $encontraArtigo = "Art.";
    $concatenaHierarquia = "";


    $valorParte = "";
    $valorLivro = "";
    $valorTitulo = "";
    $valorSubtitulo = "";
    $valorCapitulo = "";
    $valorSecao = "";
    $valorsubsecao = "";
    $valorArtigo = "";


    $documento = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $documento);
    // Converte em linhas
    $linhas = explode("\n", $documento);

    foreach ($linhas as $novalinha) {

      // Envolve cada linha em um parágrafo
      $novalinhas =   "<li><p>" . $novalinha . "</p></li>"; 

     // Verifica se tem o texto Linha na linha
     $procuraParte = strpos($novalinhas,$encontraParte);

     if ($procuraParte === false){
      $contatenaPars = 0;
     // Verifica se tem o texto Linha na linha
     $procuraLivro = strpos($novalinhas,$encontraLivro);

     if ($procuraLivro === false){
      $contatenaLivs = 0;
       // Verifica se tem o texto título na linha
       $procuraTitulo = strpos($novalinhas,$encontraTitulo);

       if ($procuraTitulo === false){
        $contatenaTits = 0;
         // Verifica se tem o texto Subtítulo na linha
         $procuraSubtitulo = strpos($novalinhas,$encontraSubtitulo);

         if ($procuraSubtitulo === false){
          $contatenaSubtits = 0;
            // Verifica se tem o texto capítulo na linha
            $procuraCapitulo = strpos($novalinhas,$encontraCapitulo);

            if ($procuraCapitulo === false){
            $contatenaCaps = 0;
             // Verifica se tem o texto Seção na linha
             $procuraSecao = strpos($novalinhas,$encontraSecao);
            
             if ($procuraSecao === false){
              $contatenaSecoes = 0;
                // Verifica se tem o texto Subseção na linha
                $procuraSubsecao = strpos($novalinhas,$encontraSubsecao);

                if ($procuraSubsecao === false){
                $contatenaSubsecoes = 0;
                   // Verifica se tem o texto Artigo na linha
                   $procuraArtigo = strpos($novalinhas,$encontraArtigo);

                   if ($procuraArtigo === false){
                    $contatenaArtigos = 0;
                      echo $novalinhas;      

                   } else {

                      $contatenaArtigos = 1;
                      // Captura o número do artigo para atribuir na ID                  
                      $artigo =  explode(" ", $novalinhas);

                      $caracteres = array("º",".");

                      $artigos = str_replace($caracteres, "", $artigo[1]);

                      $valorArtigo = 'artigo' . $artigos;

                      echo "</ul>";        
                      echo '<ul id="' . $valorArtigo . '" class="artigo">';                   
                      echo $novalinhas;

                      $valorArtigo = 'artigo' . $artigos;

                      echo "Concatena: " . concatena($concatenaHierarquia);                  
                   }     

                } else {

                  $contatenaSubsecao = 1;
                   // Captura o número romano da Subseção para atribuir na ID
                  $subsecao =  explode(" ", $novalinhas);
                  $caracteres = array("Subseção");
                  $subsecoes = romano($subsecao[1]);   
                  
                  $valorSubsecoes = 'subsecao' . $subsecoes;

                  echo "</ul>";        
                  echo '<ul id="' . $valorSubsecoes . '" class="subsecao">';                     
                  echo $novalinhas;  

                  echo "Concatena: " . concatena($concatenaHierarquia);                 
                }    

             } else {

                  $contatenaSecao = 1;
                   // Captura o número romano da Subseção para atribuir na ID
                  $secao =  explode(" ", $novalinhas);
                  $caracteres = array("Seção");
                  $secoes = romano($secao[1]);   

                  $valorSecoes = 'secao' . $secoes;

                  echo "</ul>";        
                  echo '<ul id="' . $valorSecoes . '" class="secao">';                      
                  echo $novalinhas;    

                  echo "Concatena: " . concatena($concatenaHierarquia);                  
             }     

          } else {

                  $contatenaCapitulo = 1;
                   // Captura o número romano da Subseção para atribuir na ID
                  $cap =  explode(" ", $novalinhas);
                  $caracteres = array("CAPÍTULO");
                  $caps = romano($cap[1]);  

                  $valorCapitulo = 'capitulo' . $caps;

                  echo "</ul>";        
                  echo '<ul id="' .  $valorCapitulo . '" class="capitulo">';                      
                  echo $novalinhas;  

                  echo "Concatena: " . concatena($concatenaHierarquia);                 
        }

       } else {

                  $contatenaSubtitulo = 1;
                  $subtit =  explode(" ", $novalinhas);
                  $caracteres = array("SUBTÍTULO");
                  $subtits = romano($subtit[1]);  

                  $valorSubtitulo = 'subtitulo' . $subtits;

                  echo "</ul>";        
                  echo '<ul id="' . $valorSubtitulo . '" class="subtitulo">';                      
                  echo $novalinhas; 

                  echo "Concatena: " . concatena($concatenaHierarquia);                 
       } 

     } else {

                  $contatenaTitulo = 1;
                  $tit =  explode(" ", $novalinhas);
                  $caracteres = array("TÍTULO");
                  $tits = romano($tit[1]);  

                  $valorTitulo = 'titulo' . $tits;

                  echo "</ul>";        
                  echo '<ul id="' . $valorTitulo  . '" class="titulo">';                      
                  echo $novalinhas; 

                  echo "Concatena: " . concatena($concatenaHierarquia);                            
       } 

     } else {

                  $contatenaLivro = 1;
                  $liv =  explode(" ", $novalinhas);
                  $caracteres = array("LIVRO");
                  $livs = romano($liv[1]);  

                  $valorLivro = 'livro' . $livs;

                  echo "</ul>";        
                  echo '<ul id="' . $valorLivro . '" class="livro">';                      
                  echo $novalinhas;

                  echo "Concatena: " . concatena($concatenaHierarquia);  
                  }
       } else {

                  $contatenaParte = 1;
                  $par =  explode(" ", $novalinhas);
                  $caracteres = array("PARTE");
                  $pars = romano($par[8]); 

                  $valorParte = 'parte' . $pars;

                  echo "</ul>";        
                  echo '<ul id="' . $valorParte. '" class="parte">';                      
                  echo $novalinhas;   

                  echo "Concatena: " . concatena($concatenaHierarquia);                                           
       }

    }

    ?>

Returns this error:

PHP Notice: Undefined variable: valueParte in /home/5DUrnw/Prog.php on line 155

He tells me that the variable was not defined, but on line 194, I defined it

Does anyone know why?

DEMO

2 answers

4


The problem is the scope of your variables, they should be passed as an argument in your function if you count nothing happens even if the name is equal.

$valorParte = ""; defined here is not the same found in its function($concatenaHierarquia .= $valorParte;

Variables defined in the script are global, those defined in a function are only available within it.

The function signature should look like this:

function concatena($concatenaHierarquia, $valorParte,
    $valorLivro, $valorTitulo, $valorSubtitulo, $valorCapitulo,
    $valorSecao, $valorsubsecao, $valorArtigo) {
  • +1 and I think (I’m not sure, because I don’t know PHP in depth) that you can use the function as if it were a closure through its own syntax (fountain).

  • I’m going to study about closure, but as far as the question is, I’m defining the variables outside the function, so they should work in the function, not that?

  • @Alêmoraes, the variables defined outside the function are not the same used inside concatena.

  • If I use the signature of the function you showed, I have this error > Warning: Missing argument 2 for concatena(), called in C: wamp www leis 1 - converter_txt_ul pesquisa_converter_txt_ul.php on line 300 and defined in C:wamp www laws 1 - converter_txt_ul pesquisa_converter_txt_ul.php on line 92

  • he still doesn’t have this valueParte, né?

  • @Anyway, you should call her once with all the arguments, so q seems this is not proper in your case, I’m thinking of another solution.

  • Thanks, what I intend to do is concatenate the hierarchies, I do not know if my approach is good

Show 2 more comments

1

You are trying to access from within a more internal function the variables of a more external function. This - when supported - is called closure, and although in many languages every function can be a closure, others require special syntax or even do not support closures absolutely.

In PHP you can turn a "normal" function into a closure, but it is necessary to specify exactly which variables of the external function you want to capture:

$concatena = function ($concatenaHierarquia) use ($valorParte, $valorLivro,
                                                  $valorTitulo, $valorSubtitulo,
                                                  $valorCapitulo, $valorSecao,
                                                  $valorSubsecao, $valorArtigo) {

      if ($contatenaParte = 1) {
        $concatenaHierarquia .= $valorParte;
      }
      ...
};

Source

(Don’t forget the ; at the end, since we are now assigning a function to a variable, not defining a named function.)

To call it, you now need to use the variable name:

                ...
                $valorArtigo = 'artigo' . $artigos;

                echo "Concatena: " . $concatena($concatenaHierarquia);                  
             }

Example in the ideone. Note: I did not check the output to see if everything is correct, because the code posted is too extensive in relation to what was asked. If there are more mistakes or other doubts about it, I suggest opening a new question.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.