Como posso converter uma matriz como esta em objeto?
[128] => Array
(
[status] => Figure A.
Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
)
[129] => Array
(
[status] => The other day at work, I had some spare time
)
$a = (object)['hello' => 'world'];
Respostas:
No caso mais simples, provavelmente é suficiente "converter" a matriz como um objeto:
Outra opção seria instanciar uma classe padrão como uma variável e percorrer sua matriz ao atribuir novamente os valores:
Como Edson Medina apontou, uma solução realmente limpa é usar as
json_
funções internas:Isso também (recursivamente) converte todas as suas sub-matrizes em objetos, que você pode ou não querer. Infelizmente, ele apresenta um desempenho de 2-3x na abordagem de loop.
Atenção! (obrigado ao Ultra pelo comentário):
fonte
x
na matriz tenha uma referência a outra matriz. Então,$object->x
após a execução do seu one-liner, haverá uma duplicata$array['x']
, e não mais uma referência à matriz original. Isso pode ser inofensivo em alguns aplicativos, mas para matrizes grandes ele desperdiça memória e pode atrapalhar a execução se a referência estiver sendo usada posteriormente.você pode simplesmente usar a conversão de tipos para converter uma matriz em objeto.
fonte
O caminho mais fácil seria
Mas não é isso que você quer. Se você deseja objetos, deseja obter algo, mas está faltando nesta pergunta. Usar objetos apenas pelo motivo de usar objetos não faz sentido.
fonte
Corte rápido:
Não é bonito, mas funciona.
fonte
$this
nos comentários que seguem como o acessador, é altamente implícito que ele / ela deseja umastdClass
instância como saída e não uma classe definida pelo usuário, como a sua resposta usa. Concordo com a elegância dessa solução, mas infelizmente é um padrão bastante empregado para resolver esse problema com matrizes aninhadas nas quais a conversão para o objeto não funcionará. Também é possível que o OP esteja usando uma interface que exija um objeto como entrada e não uma matriz.Aqui estão três maneiras:
Fingir um objeto real:
Converta a matriz em um objeto convertendo-a em um objeto:
Converta manualmente a matriz em um objeto:
fonte
Seu caminho para simples, isso criará um objeto para matrizes recursivas também:
fonte
false
parajson_decode()
retornará uma matriz associativa.true
parajson_decode
retornará uma matriz associativa,false
é o padrão e retornará umaStdClass
instância.Dependendo de onde você precisa disso e de como acessar o objeto, existem diferentes maneiras de fazê-lo.
Por exemplo: basta digitar
No entanto, o mais compatível é o uso de um método utilitário (ainda não parte do PHP) que implementa a conversão padrão do PHP com base em uma string que especifica o tipo (ou ignorando-o apenas de-referenciando o valor):
O exemplo de uso no seu caso ( Demonstração Online ):
fonte
Este funcionou para mim
uso:
retorna:
como de costume, você pode fazer um loop como:
fonte
$obj = (object) $array;
não funciona para matrizes multidimensionais.Não existe um método interno para fazê-lo, até onde eu saiba, mas é tão fácil quanto um loop simples:
Você pode explicar isso se precisar criar seu objeto recursivamente.
fonte
Você pode usar a função (objeto) para converter sua matriz em um objeto.
O resultado será um objeto que contém matrizes:
fonte
Na verdade, se você quiser usar isso com matrizes multidimensionais, poderá usar alguma recursão.
fonte
Eu definitivamente iria com uma maneira limpa como esta:
se você enviar:
você receberá isto:
Achei isso mais lógico ao comparar as respostas acima de Objetos que devem ser usadas para o propósito para o qual foram feitas (pequenos objetos fofos encapsulados).
O uso de get_object_vars também garante que nenhum objeto extra seja criado no Objeto manipulado (você não quer um carro com um nome de família nem uma pessoa com 4 rodas).
fonte
Você também pode usar um ArrayObject, por exemplo:
fonte
O que eu uso (é um membro da classe):
fonte
Técnica pouco complicada, mas fácil de estender:
Suponha que você tenha uma matriz
Suponha que você tenha uma classe Person que pode ter mais ou menos atributos dessa matriz. por exemplo
Se você ainda deseja alterar sua matriz para o objeto person. Você pode usar a classe ArrayIterator.
Agora você tem o objeto iterador.
Crie uma classe estendendo a classe FilterIterator; onde você deve definir o método abstrato Siga o exemplo
A impelmentação acima vinculará a propriedade somente se ela existir na classe.
Adicione mais um método na classe PersonIterator
Verifique se você tem mutadores definidos em sua classe. Agora você está pronto para chamar essas funções onde deseja criar um objeto.
fonte
recursão é seu amigo:
fonte
Isso requer PHP7 porque eu escolhi usar uma função lambda para bloquear o 'innerfunc' dentro da função principal. A função lambda é chamada recursivamente, daí a necessidade de: "use (& $ innerfunc)". Você poderia fazer isso no PHP5, mas não poderia ocultar o funcionamento interno.
fonte
use esta função que eu fiz:
Uso:
fonte
um forro
fonte
x
na matriz tenha uma referência a outra matriz. Então,$object->x
após a execução do seu one-liner, haverá uma duplicata$result_array['x']
, e não a matriz idêntica.Fácil:
Exemplo:
Então, o seguinte é verdadeiro:
fonte
Você também pode fazer isso adicionando (objeto) à esquerda da variável para criar um novo objeto.
http://codepad.org/9YmD1KsU
fonte
O uso
json_encode
é problemático devido à maneira como ele lida com dados que não são UTF-8. Vale a pena notar que o métodojson_encode
/json_encode
também deixa matrizes não associativas como matrizes. Isso pode ou não ser o que você deseja. Recentemente, eu estava na posição de precisar recriar a funcionalidade desta solução, mas sem usarjson_
funções. Aqui está o que eu vim com:fonte
Melhor método do mundo :)
se você usar métodos diferentes, terá problemas. Este é o melhor método. Você já viu.
fonte
Matrizes multidimensionais em um objeto. esse código é usado para a conversão do método try and catch da API de pesquisa do Bing.
fonte
Você pode usar o Reflection:
fonte
O CakePHP possui uma classe Set :: map recursiva que basicamente mapeia uma matriz para um objeto. Pode ser necessário alterar a aparência da matriz para tornar o objeto da maneira que você deseja.
http://api.cakephp.org/view_source/set/#line-158
Na pior das hipóteses, você poderá obter algumas idéias dessa função.
fonte
Obviamente, é apenas uma extrapolação das respostas de outras pessoas, mas aqui está a função recursiva que converterá qualquer matriz tridimensional em um objeto:
E lembre-se que se a matriz teve teclas numéricas eles ainda podem ser referenciados no objeto resultante usando
{}
(por exemplo:$obj->prop->{4}->prop
)fonte
Inspirado por todos esses códigos, tentei criar uma versão aprimorada com suporte para: nome específico da classe, evitar método construtor, padrão 'beans' e modo estrito (defina apenas as propriedades existentes):
fonte
Código
Esta função funciona da mesma forma que
json_decode(json_encode($arr), false)
.Teste
Teste 1: matriz plana
Resultado:
Teste 2: matriz de objetos
Resultado:
Teste 3: Objeto
Resultado:
fonte
eu fiz isso de maneira bem simples,
fonte