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

Para arrays multidimensionais onde a sujeira pode estar escondida numa salinha qualquer de Brasília, digo, num índice bem adentro dos níveis hierárquicos da matriz inevitavelmente irá envolver recursão.

Mas já que o escopo do tópico é em torno de variáveis dinâmicas o que automaticamente puxa dinamismo em geral, podemos criar uma versão recursiva de array_map() utilizando array_walk_recursive(). Veja como foi feito, originalmente nos comentários do manual (eu só troquei as variáveis para fazerem mais sentido :closedeyes:):

function array_map_recursive( callable $callback, array $array ) {
 
    array_walk_recursive( $array, function( &$current ) use ( $callback ) {
        $current = $callback( $current );
    });
 
    return $array;
}

Primeiro replicamos a assinatura de array_map(), que é um argumento callable (PHP 5.4+) e um array de entrada.

 

callable é um recurso de type-hinting introduzido no PHP 5.4, mas nada impede que essa keyword seja removida para fins de retrocompatibilidade, no entanto, perde-se parte da segurança de tipagem já que, por exemplo, não é feita nenhuma verificação com is_callable() sobre $callback.

array_walk_recursive() vai iterar internamente, o que é mais rápido que um foreach, por exemplo, e a cada iteração a variável $current representará o valor não-array corrente. Quando um array for encontrado como valor, ele continuará adentrando até o próximo valor que, no caso de um array indexado, seria o seu valor.

 

E como no array de exemplo só temos um valor não-array, ela trabalhará uma única vez, sobre o índice cidade.

Aqui começa a "mágica". $current é passado por referência, ou seja, tudo que acontecer com essa variável dentro do callback de array_walk_recursive() será refletido fora dele. E nesse caso isso significa refletir também no valor daquela entrada, no array informado como segundo argumento, independente do quão profundo ele estiver escondido.

Com isso em mente, alteramos essa variável para aquilo que o callback desejado faça e retornamos o array de entrada.

O resultado é o array limpo:

array (size=1)
  'nome' => 
    array (size=1)
      'cidade' => string 'teste' (length=5)

Simples, rápido e nada indolor, já que mata o problema de forma tão rápida que não dá nem pra anotar a placa. :lol:

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.