Convertendo objeto em array com PHP

Mais do que nunca têm-se trabalhado com objetos em PHP, algumas vezes de forma certa, outras vezes de forma errada, mas isso não vem ao caso, a questão é que com a explosão dos frameworks MVC e o uso da camada modelo como representante dos dados de uma aplicação, tornou-se muito comum enviar objetos ao invés de arrays para nossa camada de visualização. Até aí nenhum problema, o problema surge quando precisamos trabalhar em cima desses objetos e realizar ordenações, filtrar elementos repetidos, extrair elementos específicos, dentre outras necessidades. Apesar da SPL ter chegado, o PHP ainda não tem um framework como o Collections Framework do Java para realizar esse trabalho, então muitas vezes torna-se árduo e nem um pouco prazeroso fazer certas operações. Entretanto o PHP possui boas funções para manipular arrays e em muitos casos torna-se vantajoso transformar objetos em arrays, pois assim é possível fazer o uso dessas funções.

Pensando nas situações descritas acima e também baseado em necessidades reais do meu dia-a-dia, criei uma função muito simples que converte um objeto em array.

Imagine um objeto com a seguinte estrutura:

TableEditor Object
(
    [db] => Resource id #82
    [pk] => id_idioma_afiliado
    [table] => idioma_afiliado
    [fields] => Array
        (
            [id_idioma_afiliado] => Array
                (
                    [display] => id_idioma_afiliado
                    [input] => text
                    [values] =>
                    [default] =>
                )
 
            [afiliado_id] => Array
                (
                    [display] => afiliado_id
                    [input] => text
                    [values] =>
                    [default] =>
                )
 
            [idioma_id] => Array
                (
                    [display] => idioma_id
                    [input] => text
                    [values] =>
                    [default] =>
                )
 
            [tx_descricao_afiliado] => Array
                (
                    [display] => tx_descricao_afiliado
                    [input] => textarea
                    [values] =>
                    [default] =>
                )
 
            [tx_transfer] => Array
                (
                    [display] => tx_transfer
                    [input] => textarea
                    [values] =>
                    [default] =>
                )
 
            [tx_informacao_afiliado] => Array
                (
                    [display] => tx_informacao_afiliado
                    [input] => textarea
                    [values] =>
                    [default] =>
                )
 
            [tx_apresentacao_afiliado] => Array
                (
                    [display] => tx_apresentacao_afiliado
                    [input] => textarea
                    [values] =>
                    [default] =>
                )
 
        )
)

Se quiséssemos ordená-lo, por exemplo, apesar de não ser difícil, demandaria tempo.
Mas e se ao invés de um objeto, tivéssemos um array? Algo como:

Array
(
    [db] => Resource id #82
    [pk] => id_idioma_afiliado
    [table] => idioma_afiliado
    [fields] => Array
        (
            [id_idioma_afiliado] => Array
                (
                    [display] => id_idioma_afiliado
                    [input] => text
                    [values] =>
                    [default] =>
                )
 
            [afiliado_id] => Array
                (
                    [display] => afiliado_id
                    [input] => text
                    [values] =>
                    [default] =>
                )
 
            [idioma_id] => Array
                (
                    [display] => idioma_id
                    [input] => text
                    [values] =>
                    [default] =>
                )
 
            [tx_descricao_afiliado] => Array
                (
                    [display] => tx_descricao_afiliado
                    [input] => textarea
                    [values] =>
                    [default] =>
                )
 
            [tx_transfer] => Array
                (
                    [display] => tx_transfer
                    [input] => textarea
                    [values] =>
                    [default] =>
                )
 
            [tx_informacao_afiliado] => Array
                (
                    [display] => tx_informacao_afiliado
                    [input] => textarea
                    [values] =>
                    [default] =>
                )
 
            [tx_apresentacao_afiliado] => Array
                (
                    [display] => tx_apresentacao_afiliado
                    [input] => textarea
                    [values] =>
                    [default] =>
                )
 
        )
)

Ficaria muito mais fácil, não?!

Para obter esse resultado, basta jogar a funçãozinha abaixo como um helper no seu projeto ou criar um método estático em sua classe utilitária. Segue:

  1. function objectToArray ($object) {
  2. 	if ( count($object) > 1 ) {
  3. 		$arr = array();
  4. 		for ( $i = 0; $i < count($object); $i++ ) {
  5. 			$arr[] = get_object_vars($object[$i]);
  6. 		}
  7.  
  8.     	        return $arr;
  9.  
  10. 	} else {
  11. 		return get_object_vars($object);
  12. 	}
  13. }

Para utilizar, é simples:

  1. // $object é o seu objeto
  2. print_r(objectToArray($object));

A boa notícia é que esta função preserva toda hierarquia dos seus objetos criando dimensões dentro desse array, no caso uma matriz. O exemplo que eu usei foi bem simples, apenas para poder ilustrar o uso da função, mas caso tivéssemos um objeto mais “complexo” toda sua estrutura seria mantida sem problemas.

Uma dica bem simples, mas espero que seja de grande utilidade! :)

PHP

Se você gostou desse tópico, por favor considere deixar um comentário ou se inscreva no feed e tenha no futuro todos os tópicos entregues diretamente no seu agregador.

Comentários

5 Respostas para “Convertendo objeto em array com PHP”

Deixe seu Comentário

(obrigatório)

(obrigatório)