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:
| PHP | | copiar código | | ? |
| 01 | TableEditor Object |
| 02 | ( |
| 03 | [db] => Resource id #82 |
| 04 | [pk] => id_idioma_afiliado |
| 05 | [table] => idioma_afiliado |
| 06 | [fields] => Array |
| 07 | ( |
| 08 | [id_idioma_afiliado] => Array |
| 09 | ( |
| 10 | [display] => id_idioma_afiliado |
| 11 | [input] => text |
| 12 | [values] => |
| 13 | [default] => |
| 14 | ) |
| 15 | |
| 16 | [afiliado_id] => Array |
| 17 | ( |
| 18 | [display] => afiliado_id |
| 19 | [input] => text |
| 20 | [values] => |
| 21 | [default] => |
| 22 | ) |
| 23 | |
| 24 | [idioma_id] => Array |
| 25 | ( |
| 26 | [display] => idioma_id |
| 27 | [input] => text |
| 28 | [values] => |
| 29 | [default] => |
| 30 | ) |
| 31 | |
| 32 | [tx_descricao_afiliado] => Array |
| 33 | ( |
| 34 | [display] => tx_descricao_afiliado |
| 35 | [input] => textarea |
| 36 | [values] => |
| 37 | [default] => |
| 38 | ) |
| 39 | |
| 40 | [tx_transfer] => Array |
| 41 | ( |
| 42 | [display] => tx_transfer |
| 43 | [input] => textarea |
| 44 | [values] => |
| 45 | [default] => |
| 46 | ) |
| 47 | |
| 48 | [tx_informacao_afiliado] => Array |
| 49 | ( |
| 50 | [display] => tx_informacao_afiliado |
| 51 | [input] => textarea |
| 52 | [values] => |
| 53 | [default] => |
| 54 | ) |
| 55 | |
| 56 | [tx_apresentacao_afiliado] => Array |
| 57 | ( |
| 58 | [display] => tx_apresentacao_afiliado |
| 59 | [input] => textarea |
| 60 | [values] => |
| 61 | [default] => |
| 62 | ) |
| 63 | |
| 64 | ) |
| 65 | ) |
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:
| PHP | | copiar código | | ? |
| 01 | Array |
| 02 | ( |
| 03 | [db] => Resource id #82 |
| 04 | [pk] => id_idioma_afiliado |
| 05 | [table] => idioma_afiliado |
| 06 | [fields] => Array |
| 07 | ( |
| 08 | [id_idioma_afiliado] => Array |
| 09 | ( |
| 10 | [display] => id_idioma_afiliado |
| 11 | [input] => text |
| 12 | [values] => |
| 13 | [default] => |
| 14 | ) |
| 15 | |
| 16 | [afiliado_id] => Array |
| 17 | ( |
| 18 | [display] => afiliado_id |
| 19 | [input] => text |
| 20 | [values] => |
| 21 | [default] => |
| 22 | ) |
| 23 | |
| 24 | [idioma_id] => Array |
| 25 | ( |
| 26 | [display] => idioma_id |
| 27 | [input] => text |
| 28 | [values] => |
| 29 | [default] => |
| 30 | ) |
| 31 | |
| 32 | [tx_descricao_afiliado] => Array |
| 33 | ( |
| 34 | [display] => tx_descricao_afiliado |
| 35 | [input] => textarea |
| 36 | [values] => |
| 37 | [default] => |
| 38 | ) |
| 39 | |
| 40 | [tx_transfer] => Array |
| 41 | ( |
| 42 | [display] => tx_transfer |
| 43 | [input] => textarea |
| 44 | [values] => |
| 45 | [default] => |
| 46 | ) |
| 47 | |
| 48 | [tx_informacao_afiliado] => Array |
| 49 | ( |
| 50 | [display] => tx_informacao_afiliado |
| 51 | [input] => textarea |
| 52 | [values] => |
| 53 | [default] => |
| 54 | ) |
| 55 | |
| 56 | [tx_apresentacao_afiliado] => Array |
| 57 | ( |
| 58 | [display] => tx_apresentacao_afiliado |
| 59 | [input] => textarea |
| 60 | [values] => |
| 61 | [default] => |
| 62 | ) |
| 63 | |
| 64 | ) |
| 65 | ) |
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:
| PHP | | copiar código | | ? |
| 01 | function objectToArray ($object) { |
| 02 | if ( count($object) > 1 ) { |
| 03 | $arr = array(); |
| 04 | for ( $i = 0; $i < count($object); $i++ ) { |
| 05 | $arr[] = get_object_vars($object[$i]); |
| 06 | } |
| 07 | |
| 08 | return $arr; |
| 09 | |
| 10 | } else { |
| 11 | return get_object_vars($object); |
| 12 | } |
| 13 | } |
Para utilizar, é simples:
| PHP | | copiar código | | ? |
| 1 | // $object é o seu objeto |
| 2 | echo "<pre>"; |
| 3 | print_r(objectToArray($object)); |
| 4 | echo "</pre>"; |
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! :)
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.




