Conversões entre arrays e objetos no PHP

Em: 01/05/2008 Tags: Referencie do seu blog (Trackback)

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).

Artigos relacionados:

Escreva um comentário (utilize o formato Markdown)