Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Henrique da Costa

Converter string em variavel

Recommended Posts

Galera to com a seguinte duvida, eu tenho um trecho de código que faz pra mim o tratamento de variável vazia!

 

$_POST['nome'] = 'teste';

foreach ( $_POST as $id => $valor ) {
$_POST [$id] = trim ( $valor );
}
só que eu gostaria de saber o seguinte, quando eu dou o extract($_POST), ele transforma todos os post em variavel e o no caso $nome não teria esse tratamento de "trim"
Gostaria de saber como faço para eu informar q o "$nome" também vai receber esse tratamento?

Compartilhar este post


Link para o post
Compartilhar em outros sites

não ele envia normal, mas se eu der um "space" ele já não é considerado como vázio

ou seja eu utilizo o trim para remover esse espaço vázio q ele digitou, só que se eu coloco $nomeVariavel e não $_POST['nomeVariavel'], ele não faz esse tratamento no $nomeVariavel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Toma aew


<?php
	
$_POST['nome'] = 'teste';

foreach($_POST as $post => $val){
	if(!empty($post)){	
		$variables = '$' ."{$post} = trim('" . $val . "');";		
		eval($variables);
		echo $variables . "<br />";
	}	
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O trim deve funcionar de igual maneira para o $nomeVariavel, se você estiver recebendo varios $nomeVariavel transforme essa variavél em um array e faça como você fez acima com o foreach. Se não use

 

if( !empty(trim($_POST['nomeVariavel']))){
   $nomeVariavel = $_POST['nomeVariavel'];
} else {
   // Erro
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certo Rafael, vlw mesmo

 

Que bom que pude ajudar! :D

 

Gente encontrei um outro problema, tipo deu certo o que o Rafael fez, só que se o "POST" for um array?

por exemplo:

 

$_POST['modulos'][1] = 'teste';

 

como faria isso? teria q fazer uma função recursiva?

 

faz um segundo foreach

Compartilhar este post


Link para o post
Compartilhar em outros sites

La vai eu de novo, acho que vou me candidatar à moderador do Imasters :D

 

<?php

$_POST['nome'] = 'Doido da silva' ;

$_POST['docs']['cpf'] = '123.456.789-99' ;
$_POST['docs']['rg'] = '23.565.989-7' ;

$it = new RecursiveIteratorIterator( new RecursiveArrayIterator($_POST));

foreach ($it as $key=>$val){
	if(!empty($key)){	
		$trim = !empty($val) ? trim($val) : '';
		$variables = '$' ."{$key} = '{$trim}' ;";		
		eval($variables);
	}
}	

// Teste para ver se criou a variável
echo "Ola {$nome}!, voc&ecir; cadastrou o CPF: {$cpf}, e RG:{$rg}. Parabéns!";

?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso disso que você passou agora deu certo em termos de váriaveis Raphael, mas no caso de dar trim na propria variavel $_POST

eu tentei incluir: $_POST[$key] = $trim; mas não deu certo, parece q fica num loop infinito ne?

 

Esquece o que eu disse, ficou assim no meu código

 

$it = new RecursiveIteratorIterator ( new RecursiveArrayIterator ( $_POST ) );

foreach ( $it as $key => $val ) {
if (! empty ( $key )) {
$trim = ! empty ( $val ) ? trim ( $val ) : '';
$variables = '$' . "{$key} = '{$trim}' ;";
$_POST [$key] = trim ( $val );
eval ( $variables );
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso disso que você passou agora deu certo em termos de váriaveis Raphael, mas no caso de dar trim na propria variavel $_POST

eu tentei incluir: $_POST[$key] = $trim; mas não deu certo, parece q fica num loop infinito ne?

 

Esquece o que eu disse, ficou assim no meu código

 

$it = new RecursiveIteratorIterator ( new RecursiveArrayIterator ( $_POST ) );

 

foreach ( $it as $key => $val ) {

if (! empty ( $key )) {

$trim = ! empty ( $val ) ? trim ( $val ) : '';

$variables = '$' . "{$key} = '{$trim}' ;";

$_POST [$key] = trim ( $val );

eval ( $variables );

}

}

 

Simples, coloque o nome da variavel

 

No caso disso que você passou agora deu certo em termos de váriaveis Raphael, mas no caso de dar trim na propria variavel $_POST

eu tentei incluir: $_POST[$key] = $trim; mas não deu certo, parece q fica num loop infinito ne?

 

Esquece o que eu disse, ficou assim no meu código

 

$it = new RecursiveIteratorIterator ( new RecursiveArrayIterator ( $_POST ) );

 

foreach ( $it as $key => $val ) {

if (! empty ( $key )) {

$trim = ! empty ( $val ) ? trim ( $val ) : '';

$variables = '$' . "{$key} = '{$trim}' ;";

$_POST [$key] = trim ( $val );

eval ( $variables );

}

}

 

Simples,

 

<?php

$_POST['nome'] = 'Doido da silva' ;

$_POST['docs']['cpf'] = '123.456.789-99' ;
$_POST['docs']['rg'] = '23.565.989-7' ;

$it = new RecursiveIteratorIterator( new RecursiveArrayIterator($_POST));

// ACHO UM TANTO IMPROVAVEL VC UTILIZAR VARIAVEIS COM ESTE NOME 

foreach ($it as $key056789kiop =>$val056789kiop){
	if(!empty($key056789kiop)){	
		$trim = !empty($val056789kiop) ? trim($val056789kiop) : '';
		$variables = '$' ."{$key056789kiop} = '{$trim}' ;";		
		eval($variables);
	}
}	

// Teste para ver se criou a variável
echo "Ola {$nome}!, voc&ecir; cadastrou o CPF: {$cpf}, e RG:{$rg}. Parabéns!";

?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na minha humilde opinião, sua idéia inicial, sobrescrevendo os dados de um superglobal é extremamente errado. Os superglobais deveria ser somente leitura para o programador porque se podem ser alterados, podem ser violados.

Mas a solução escolhida, pra mim, além de ser errado por usal EVIL EVAL, ainda mata formiga com bala de canhão por usar dois Iterators.

Você poderia simplesmente criar uma rotina que executasse a limpeza e aplicá-la com array_map(). Poderia até criar uma função que 'embalasse" (tradução porca de "wrap") toda a rotina para você invocá-la em uma linha sempre que rpecisasse:

function cleanup( $what ) {
 
    $data = array_map(
 
        function( $current ) {
 
            return trim( $current );
        },
 
        $what
    );
 
    return $data;
}

Exemplo de uso:

$post = array( 'name' => '      Bruno Augusto    ', 'password' => '    ' );
 
var_dump( $post );
 
$data = cleanup( $post );
 
var_dump( $data );

Aqui usei uma variável manualmente criada com dados propositalmente sujos a qual você substituiria por $_POST.

Assim você não mais usaria $_POST e sim $data, mas pelo menos faria uma coisa simples de um jeito simples e manteria a integridade que um superglobal deveria ter por padrão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na minha humilde opinião, sua idéia inicial, sobrescrevendo os dados de um superglobal é extremamente errado. Os superglobais deveria ser somente leitura para o programador porque se podem ser alterados, podem ser violados.

 

Mas a solução escolhida, pra mim, além de ser errado por usal EVIL EVAL, ainda mata formiga com bala de canhão por usar dois Iterators.

 

Você poderia simplesmente criar uma rotina que executasse a limpeza e aplicá-la com array_map(). Poderia até criar uma função que 'embalasse" (tradução porca de "wrap") toda a rotina para você invocá-la em uma linha sempre que rpecisasse:

function cleanup( $what ) {
 
    $data = array_map(
 
        function( $current ) {
 
            return trim( $current );
        },
 
        $what
    );
 
    return $data;
}

Exemplo de uso:

$post = array( 'name' => '      Bruno Augusto    ', 'password' => '    ' );
 
var_dump( $post );
 
$data = cleanup( $post );
 
var_dump( $data );

Aqui usei uma variável manualmente criada com dados propositalmente sujos a qual você substituiria por $_POST.

 

Assim você não mais usaria $_POST e sim $data, mas pelo menos faria uma coisa simples de um jeito simples e manteria a integridade que um superglobal deveria ter por padrão.

 

Desculpe a minha ignorância, mas se ele usasse $data = $_POST .

 

E utilizasse este $data ao invés de $_POST, que foi um exemplo.

 

Talvez a pergunta seja bastante tola, mas final de dia a mente explode, e não consegui acompanhar seu raciocínio :D

 

Fora q n identifiquei a questão da criação de variaveis dinamicamente através de strings. Grato :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que não entendi direito sua dúvida, mas veja o $data de FORA da função representa uma coisa e o $data de DENTRO da função outra.

 

Essa função seria usada assim:

$data = cleanup( $_POST );

$_POST continuaria intacto (e sujo). $data teria os mesmos valores de $_POST, porém, limpos. E uma vez que você faz essa limpeza, passa a ter em $data um array cujas chaves são os atributos name do HTML e os valores aquilo preenchido, recebido e informado pelo browser por intermédio do atributo value.

 

No código que eu postei, de fato, não existe a criação de variáveis dinâmicas porque eu simplesmente detesto isso. Mas nada impediria de fazer:

extract( $data );
E ter variáveis nomeadas como $nome, $rg, $cpf...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na realidade a única maneira que conheço de criação de variáveis dinamicamente é por eval.

 

Também não sou muito fã de criação de variáveis dinâmicas, mas o criador do tópico tinha esta dúvida, postei o que sabia.

 

Não coloquei dentro de função para que as variáveis criadas não ficassem no escopo da função, sem ter de colocá-las no

escopo global (Aí entrou o iterator).

 

Abcs à todos! :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Raphael Barros, eu encontrei o seguinte detalhe, ela funciona de boa no quisito variavel;

 

Mas tipo, e quando eu tenho arrays de POSTS, no caso quero dar trim em todos os $_POST que vier, por exemplo

$teste = array(
              "nome"=>array(
                             "cidade" => "      teste     "
                             )
              )

Ai no caso gostaria de limpar o " teste " e nesse caso ai que passamos por ai acima não da certo entende?

tem alguma solução a nao ser eu criar uma função para varrer todos e se for array, ele retornar a fazer a função, tipo isso abaixo

 

function cleanup($array){
    foreach ($array as $id => $valor){
        if(is_array($valor)==false){
            $_POST[$id] = trim($valor);
            $_GET[$id] = trim($valor);
        }else{
            cleanup($valor);
        }
    }
}

cleanup($_POST);

Eu sei que esse jeito também não deu certo, mas sei la, aguma coisa relacionado sabe

Compartilhar este post


Link para o post
Compartilhar em outros sites

Removido e modificado do manual http://www.php.net/manual/pt_BR/function.array-walk-recursive.php

 

<?php
$sweet = array('a' => '   maca    ', 'b' => '   banana  ');
$fruits = array('sweet' => $sweet, 'sour' => '   lemon  ');
	

	
class A_Class {
	
	function array_walk_recursive(&$input, $funcname, $userdata = '') {
		if(!function_exists('array_walk_recursive')) {
			if(!is_callable($funcname))
			return false;
			
			if(!is_array($input))
			return false;
			
			foreach($input as $key=>$value) {
				if(is_array($input[$key])) {
					if(isset($this)) {
						eval('$this->' . __FUNCTION__ . '($input[$key], $funcname, $userdata);');
					} else {
						if(@get_class($this))
						eval(get_class() . '::' . __FUNCTION__ . '($input[$key], $funcname, $userdata);');
						else
						eval(__FUNCTION__ . '($input[$key], $funcname, $userdata);');
					}
				} else {
					$saved_value = $value;
					
					if(is_array($funcname)) {
						$f = '';
						for($a=0; $a<count($funcname); $a++)
						if(is_object($funcname[$a])) {
							$f .= get_class($funcname[$a]);
						} else {
							if($a > 0)
							$f .= '::';
							$f .= $funcname[$a];
						}
						$f .= '($value, $key' . (!empty($userdata) ? ', $userdata' : '') . ');';
						eval($f);
					} else {
						if(!empty($userdata))
						$funcname($value, $key, $userdata);
						else
						$funcname($value, $key);
					}
					
					if($value != $saved_value)
					$input[$key] = $value;
				}
			}
			return true;
		} else {
			array_walk_recursive($input, $funcname, $userdata);
		}
	}
	
	function kv_trim(&$v, $k) {
		$v = trim($v);
	}
	
}

$class = new A_Class();
$class->array_walk_recursive($fruits, array(&$class, 'kv_trim'));
print_r($fruits);

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

#16,

sobre as variáveis criadas dinamicamente, tem um recurso no php chamado "variables variables"

 

sobre esses laços de repetição, uso de eval, etc... tb todos um tanto desnecessários segundo o foco da questão, a qual é apenas aplicar um trim()..

 

li os posts até o 17º antes de responder.. mas um exemplo mais adequado é o postado no #12

 

veja também as funções de manipulação de arrays como o array_walk_recursive..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.