¿Cómo puedo convertir una matriz como esta en 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'];
Respuestas:
En el caso más simple, probablemente sea suficiente "convertir" la matriz como un objeto:
Otra opción sería crear una instancia de una clase estándar como variable y recorrer su matriz mientras reasigna los valores:
Como señaló Edson Medina , una solución realmente limpia es usar las
json_
funciones integradas:Esto también (recursivamente) convierte todas sus sub matrices en objetos, que puede querer o no. Desafortunadamente, tiene un rendimiento de 2-3x sobre el enfoque de bucle.
¡Advertencia! (gracias a Ultra por el comentario):
fuente
x
en la matriz contiene una referencia a otra matriz. Luego,$object->x
después de la ejecución de su one-liner, habrá un duplicado de$array['x']
, ya no será una referencia a la matriz original. Esto puede ser inofensivo en algunas aplicaciones, pero para matrices grandes desperdicia memoria y puede estropear la ejecución si la referencia se usa más adelante.simplemente puede usar la conversión de tipos para convertir una matriz en objeto.
fuente
La manera fácil sería
Pero eso no es lo que quieres. Si quieres objetos, quieres lograr algo, pero eso falta en esta pregunta. Usar objetos solo por el motivo de usar objetos no tiene sentido.
fuente
Hack rápido:
No es bonito, pero funciona.
fuente
$this
en los comentarios que siguen como accesor, está muy implícito que desea unastdClass
instancia como salida y no una clase definida por el usuario como la que usa su respuesta. Estoy de acuerdo con la elegancia de esta solución, pero desafortunadamente es un patrón muy comúnmente empleado para resolver este problema con matrices anidadas donde la conversión a objetos no funcionará. También es posible que OP esté usando una interfaz que requiera un objeto como entrada y no una matriz.Aquí hay tres formas:
Fingir un objeto real:
Convierta la matriz en un objeto convirtiéndolo en un objeto:
Convierta manualmente la matriz en un objeto:
fuente
Su forma simple, esto creará un objeto para matrices recursivas también:
fuente
false
ajson_decode()
devolverá una matriz asociativa.true
ajson_decode
devolverá una matriz asociativa,false
es el valor predeterminado y devolverá unaStdClass
instancia.Dependiendo de dónde lo necesite y de cómo acceder al objeto, hay diferentes formas de hacerlo.
Por ejemplo: simplemente escríbalo
Sin embargo, el más compatible es usar un método de utilidad (que aún no forma parte de PHP) que implementa la conversión estándar de PHP basada en una cadena que especifica el tipo (o al ignorarlo simplemente desreferenciando el valor):
El ejemplo de uso en su caso ( demostración en línea ):
fuente
Este me funcionó
uso:
devoluciones :
como de costumbre, puedes repetirlo como:
fuente
$obj = (object) $array;
no funciona para matrices multidimensionales.No hay ningún método incorporado para hacerlo, que yo sepa, pero es tan fácil como un simple ciclo:
Puede exponer eso si lo necesita para construir su objeto de forma recursiva.
fuente
Puede usar la función (objeto) para convertir su matriz en un objeto.
El resultado será un objeto que contiene matrices:
fuente
En realidad, si desea usar esto con matrices multidimensionales, querrá usar algo de recursión.
fuente
Definitivamente iría con una forma limpia como esta:
si envía:
obtendrás esto:
Encontré esto más lógico al comparar las respuestas anteriores de Objetos que deberían usarse para el propósito para el que fueron hechas (pequeños objetos lindos encapsulados).
El uso de get_object_vars también garantiza que no se creen atributos adicionales en el Objeto manipulado (no desea que un automóvil tenga un apellido, ni una persona que se comporte 4 ruedas).
fuente
También podría usar un ArrayObject, por ejemplo:
fuente
El que uso (es un miembro de la clase):
fuente
Técnica poco complicada pero fácil de extender:
Supongamos que tienes una matriz
Suponga que tiene una clase Person que puede tener más o menos atributos de esta matriz. por ejemplo
Si todavía quieres cambiar tu matriz al objeto persona. Puede usar la clase ArrayIterator.
Ahora tienes un objeto iterador.
Cree una clase que extienda la clase FilterIterator; donde tienes que definir el método abstracto aceptar. Sigue el ejemplo
La implementación anterior vinculará la propiedad solo si existe en la clase.
Agregue un método más en la clase PersonIterator
Asegúrese de tener mutadores definidos en su clase. Ahora está listo para llamar a estas funciones donde desea crear objetos.
fuente
la recursividad es tu amiga:
fuente
Esto requiere PHP7 porque elegí usar una función lambda para bloquear el 'innerfunc' dentro de la función principal. La función lambda se llama recursivamente, de ahí la necesidad de: "use (& $ innerfunc)". Puede hacerlo en PHP5 pero no puede ocultar el innerfunc.
fuente
use esta función que hice:
Uso:
fuente
un trazador de líneas
fuente
x
en la matriz contiene una referencia a otra matriz. Luego,$object->x
después de la ejecución de su línea única, habrá un duplicado de$result_array['x']
, no la matriz idéntica.Fácil:
Ejemplo:
Entonces, lo siguiente es cierto:
fuente
También puede hacer esto agregando (objeto) a la izquierda de la variable para crear un nuevo objeto.
http://codepad.org/9YmD1KsU
fuente
El uso
json_encode
es problemático debido a la forma en que maneja los datos que no son UTF-8. Vale la pena señalar que el métodojson_encode
/json_encode
también deja matrices no asociativas como matrices. Esto puede o no ser lo que quieres. Recientemente estuve en la posición de necesitar recrear la funcionalidad de esta solución pero sin usarjson_
funciones. Esto es lo que se me ocurrió:fuente
El mejor método en el mundo :)
Si utiliza diferentes métodos, tendrá problemas. Este es el mejor método. Alguna vez has visto.
fuente
Matrices multidimensionales en un objeto. Este código se utiliza para la conversión del método de prueba y captura de la API de búsqueda de Bing.
fuente
Puedes usar Reflection:
fuente
CakePHP tiene una clase recursiva Set :: map que básicamente asigna una matriz a un objeto. Es posible que deba cambiar el aspecto de la matriz para que el objeto se vea como lo desea.
http://api.cakephp.org/view_source/set/#line-158
En el peor de los casos, es posible que pueda obtener algunas ideas de esta función.
fuente
Obviamente, solo una extrapolación de las respuestas de otras personas, pero aquí está la función recursiva que convertirá cualquier matriz tridimensional en un objeto:
Y recuerda que si la matriz tenía teclas numéricas que todavía puede hacer referencia en el objeto resultante mediante el uso
{}
(por ejemplo:$obj->prop->{4}->prop
)fuente
Inspirado por todos estos códigos, traté de crear una versión mejorada con soporte para: nombre de clase específico, evitar el método del constructor, el patrón 'beans' y el modo estricto (establecer solo las propiedades existentes):
fuente
Código
Esta función funciona igual que
json_decode(json_encode($arr), false)
.Pruebas
Prueba 1: matriz plana
Salida:
Prueba 2: matriz de objetos
Salida:
Prueba 3: objeto
Salida:
fuente
Lo he hecho de manera bastante simple,
fuente