Conversões entre arrays e objetos no PHP
Arrays associativos e objetos herdeiros da classe StdClass
são bastante parecidos no PHP: você define uma variável e
começa a pendurar valores nela. Vamos ver como isso funciona
na prática.
$person1 = array();
$person1['name'] = 'Caio';
$person1['age'] = 22;
$person1['city'] = 'Florianópolis';
$person2 = new StdClass;
$person2->name = 'Caio';
$person2->age = 22;
$person2->city = 'Florianópolis';
O código acima mostra como arrays associativos e objetos StdClass
são similares em sua sintaxe e semântica. Uma coisa que pode não parecer
muito óbvia inicialmente é que converter um tipo de dados no outro
é trivial em PHP.
A conversão de objeto para array associativo é a mais trivial:
$person2_as_array = get_object_vars($person2);
A saída do programa mostra os conteúdos do array resultante:
Array
(
[name] => Caio
[age] => 22
[city] => Florianópolis
)
Ou seja: get_object_vars() retorna um array onde cada propriedade
do objeto original é convertido em um índice desse array, e os
respectivos valores das propriedades do objeto original tornam-se
os valores associados aos índices do novo array.
Para converter um array associativo para objeto o PHP não nos dá nenhuma função padrão, mas podemos escrever uma:
function array_to_object($array) {
$object = new StdClass;
foreach ($array as $key => $value) {
$object->$key = $value;
}
return $object;
}
E como a utilizaríamos:
$person1_as_object = array_to_object($person1);
var_export($person1_as_object);
O resultado da execução do código acima seria:
stdClass::__set_state(array(
'name' => 'Caio',
'age' => 22,
'city' => 'Florianópolis',
))
Ou seja, nosso array tornou-se, de fato, um objeto PHP.
Mas, para falar a verdade, array_to_object seria reinventar a roda.
Como disse acima, a linguagem não nos dá uma função que faça isso,
mas nos dá uma estranha funcionalidade de conversão de tipo. Veja
como convertemos o array $person1 para um objeto com 1 linha de código:
$person1_as_object = (object) $person1;
E o resultado final é o mesmo gerado pela nossa função array_to_object.
Leia mais sobre esse truque neste link.
Sumarizando: de array associativo para objeto utilize (object) $array,
e de objeto para array associativo utilize get_object_vars($object).
