Estou integrando uma API ao meu site que funciona com dados armazenados em objetos enquanto meu código é escrito usando matrizes.
Eu gostaria de uma função rápida e suja para converter um objeto em uma matriz.
Basta digitar
$array = (array) $yourObject;
Das matrizes :
Se um objeto é convertido em uma matriz, o resultado é uma matriz cujos elementos são as propriedades do objeto. As chaves são os nomes das variáveis dos membros, com algumas exceções notáveis: propriedades inteiras são inacessíveis; variáveis privadas têm o nome da classe anexado ao nome da variável; variáveis protegidas têm um '*' anexado ao nome da variável. Esses valores anexados têm bytes nulos em ambos os lados.
Exemplo: Objeto Simples
$object = new StdClass;
$object->foo = 1;
$object->bar = 2;
var_dump( (array) $object );
Resultado:
array(2) {
'foo' => int(1)
'bar' => int(2)
}
Exemplo: Objeto complexo
class Foo
{
private $foo;
protected $bar;
public $baz;
public function __construct()
{
$this->foo = 1;
$this->bar = 2;
$this->baz = new StdClass;
}
}
var_dump( (array) new Foo );
Saída (com \ 0s editado para maior clareza):
array(3) {
'\0Foo\0foo' => int(1)
'\0*\0bar' => int(2)
'baz' => class stdClass#2 (0) {}
}
Saída com em var_export
vez de var_dump
:
array (
'' . "\0" . 'Foo' . "\0" . 'foo' => 1,
'' . "\0" . '*' . "\0" . 'bar' => 2,
'baz' =>
stdClass::__set_state(array(
)),
)
A conversão de tipos dessa maneira não fará a conversão profunda do gráfico do objeto e você precisará aplicar os bytes nulos (conforme explicado na cotação manual) para acessar quaisquer atributos não públicos. Portanto, isso funciona melhor ao converter objetos StdClass ou objetos com apenas propriedades públicas. Para rápido e sujo (o que você pediu), tudo bem.
Veja também este post em profundidade:
ArrayAccess
interface, talvez em combinação com esta solução. php.net/manual/en/class.arrayaccess.php[1 => "one"]
torna-se["1" => "one"]
(array)
e(object)
funciona de maneira confiável e igual em todas as versões desde o PHP 4.3. Veja 3v4l.org/X6lhm . Se você receber um erro de sintaxe, fez algo errado.empty
. Você não pode usar uma expressãoempty
anterior à 5.5. Isso não tem nenhuma relação com a tipografia;)É possível converter rapidamente objetos profundamente aninhados em matrizes associativas, contando com o comportamento das funções de codificação / decodificação JSON:
fonte
Desde o primeiro hit do Google para " objeto PHP para associar matriz ", temos o seguinte:
A fonte está em codesnippets.joyent.com .
fonte
function objectToArray($o) { $a = array(); foreach ($o as $k => $v) $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; return $a; }
isso apenas define qualquer coisa que não seja um objeto ou matriz e continua sem que o método seja invocado repetidamente, a menos que seja necessário.Se as propriedades do seu objeto forem públicas, você poderá:
Se forem privados ou protegidos, terão nomes de chave estranhos na matriz. Portanto, neste caso, você precisará da seguinte função:
fonte
Resultado
fonte
Aqui está um código:
fonte
Todas as outras respostas postadas aqui estão funcionando apenas com atributos públicos. Aqui está uma solução que funciona com objetos do tipo JavaBeans usando reflexão e getters:
fonte
public
propriedades?Que tal
get_object_vars($obj)
? Parece útil se você deseja acessar apenas as propriedades públicas de um objeto.Veja get_object_vars .
fonte
Digite converter seu objeto em uma matriz.
Isso resolverá o seu problema.
fonte
Primeiro de tudo, se você precisar de uma matriz de um objeto, provavelmente deverá constituir os dados como uma matriz primeiro. Pense nisso.
Não use uma
foreach
declaração ou transformações JSON. Se você está planejando isso, novamente está trabalhando com uma estrutura de dados, não com um objeto.Se você realmente precisar, use uma abordagem orientada a objetos para ter um código limpo e sustentável. Por exemplo:
Objeto como matriz
Se você precisar de todas as propriedades, use um objeto de transferência:
fonte
Você pode facilmente usar esta função para obter o resultado:
Use PHP 5 ou posterior.
fonte
Aqui está minha função PHP recursiva para converter objetos PHP em uma matriz associativa:
Exemplo de uso:
fonte
$new_arr1 = (array) $my_object;
Para converter um objeto em matriz, basta convertê-lo explicitamente:
fonte
Você também pode criar uma função no PHP para converter uma matriz de objetos:
fonte
Você pode fazer isso ao obter dados como objetos de bancos de dados:
fonte
Função personalizada para converter stdClass em uma matriz:
Outra função personalizada para converter Array em stdClass:
Exemplo de uso:
fonte
Usar:
Retorna uma matriz sem caracteres especiais e nomes de classe.
fonte
Esta resposta é apenas a união das diferentes respostas deste post, mas é a solução para converter um objeto PHP com propriedades públicas ou privadas com valores simples ou matrizes em uma matriz associativa ...
fonte
Alguns aprimoramentos no código "bem conhecido"
Observe que, se a função for membro de uma classe (como acima), você deverá alterar
__FUNCTION__
para__METHOD__
fonte
Além disso, você pode usar o Symfony Serializer Component
fonte
Para o seu caso, era correto / bonito se você usasse os padrões "decorador" ou "transformação do modelo de data". Por exemplo:
Seu modelo
Decorador
Uso
Portanto, será um código mais bonito e mais correto.
fonte
Convertendo e removendo estrelas irritantes:
Provavelmente, será mais barato do que usar reflexões.
fonte
Solução curta de @ SpYk3HH
fonte
Como muitas pessoas acham essa pergunta por causa de problemas com o acesso dinâmico aos atributos de um objeto, apenas mostrarei que você pode fazer isso no PHP:
$valueRow->{"valueName"}
No contexto (saída HTML removida para facilitar a leitura):
fonte
Usando typecasting, você pode resolver seu problema. Basta adicionar as seguintes linhas ao seu objeto de retorno:
Você também pode adicionar um novo par de chave e valor usando:
fonte
Eu acho que é uma boa idéia usar características para armazenar a lógica de conversão de objeto em matriz. Um exemplo simples:
fonte
fonte
Aqui eu criei um método objectToArray () , que também funciona com objetos recursivos, como quando
$objectA
contém$objectB
quais pontos novamente$objectA
.Além disso, restringi a saída a propriedades públicas usando ReflectionClass. Livre-se disso, se você não precisar.
Para identificar objetos já usados, estou usando uma propriedade protegida nesta classe (abstrata), denominada
$this->usedObjects
. Se um objeto aninhado recursivo for encontrado, ele será substituído pela sequência**recursive**
. Caso contrário, ele falharia devido ao loop infinito.fonte
$usedObjects
não é inicializado no início, portanto, chamar isso várias vezes fornecerá resultados incorretos em chamadas posteriores. Além disso, você não o libera no final, para que seus objetos nunca sejam removidos da memória.Aqui está a minha proposta, se você tiver objetos em objetos com membros privados:
fonte
Eu uso isso (solução recursiva necessária com chaves apropriadas):
Exemplo de uso, o seguinte código:
Irá imprimir isto:
fonte