Estoy integrando una API en mi sitio web que funciona con datos almacenados en objetos mientras mi código se escribe usando matrices.
Me gustaría una función rápida y sucia para convertir un objeto en una matriz.
Solo escríbelo
$array = (array) $yourObject;
De matrices :
Si un objeto se convierte en una matriz, el resultado es una matriz cuyos elementos son las propiedades del objeto. Las claves son los nombres de las variables miembro, con algunas excepciones notables: no se puede acceder a las propiedades enteras; las variables privadas tienen el nombre de la clase antepuesto al nombre de la variable; Las variables protegidas tienen un '*' antepuesto al nombre de la variable. Estos valores antepuestos tienen bytes nulos a cada lado.
Ejemplo: objeto simple
$object = new StdClass;
$object->foo = 1;
$object->bar = 2;
var_dump( (array) $object );
Salida:
array(2) {
'foo' => int(1)
'bar' => int(2)
}
Ejemplo: objeto complejo
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 );
Salida (con \ 0s editado para mayor claridad):
array(3) {
'\0Foo\0foo' => int(1)
'\0*\0bar' => int(2)
'baz' => class stdClass#2 (0) {}
}
Salida con en var_export
lugar de var_dump
:
array (
'' . "\0" . 'Foo' . "\0" . 'foo' => 1,
'' . "\0" . '*' . "\0" . 'bar' => 2,
'baz' =>
stdClass::__set_state(array(
)),
)
La conversión de texto de esta manera no hará una conversión profunda del gráfico de objeto y debe aplicar los bytes nulos (como se explica en la cita manual) para acceder a los atributos no públicos. Entonces, esto funciona mejor cuando se convierten objetos StdClass u objetos con solo propiedades públicas. Para rápido y sucio (lo que pediste) está bien.
También vea esta publicación de blog en profundidad:
ArrayAccess
interfaz, quizás en combinación con esta solución. php.net/manual/en/class.arrayaccess.php[1 => "one"]
se convierte en["1" => "one"]
(array)
y(object)
funciona de manera confiable e igual en todas las versiones desde PHP 4.3. Ver 3v4l.org/X6lhm . Si obtiene un error de sintaxis, hizo algo mal.empty
Registro de cambios para . No puede usar una expresiónempty
anterior a 5.5. Esto no tiene ninguna relación con el encasillamiento;)Puede convertir rápidamente objetos profundamente anidados en matrices asociativas confiando en el comportamiento de las funciones de codificación / decodificación JSON:
fuente
Desde el primer hit de Google para " Objeto PHP a matriz asociada " tenemos esto:
La fuente está en codesnippets.joyent.com .
fuente
function objectToArray($o) { $a = array(); foreach ($o as $k => $v) $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; return $a; }
esto establece cualquier cosa que no sea un objeto o matriz y continúa sin una repetición del método, a menos que sea necesario.Si sus propiedades de objeto son públicas, puede hacer:
Si son privados o están protegidos, tendrán nombres de claves extraños en la matriz. Entonces, en este caso necesitará la siguiente función:
fuente
Salida
fuente
Aquí hay un código:
fuente
Todas las demás respuestas publicadas aquí solo funcionan con atributos públicos. Aquí hay una solución que funciona con objetos similares a JavaBeans que usan reflexión y captadores:
fuente
public
propiedades?Qué pasa
get_object_vars($obj)
? Parece útil si solo desea acceder a las propiedades públicas de un objeto.Ver get_object_vars .
fuente
Escriba emitir su objeto a una matriz.
Resolverá tu problema.
fuente
En primer lugar, si necesita una matriz de un objeto, probablemente debería constituir los datos como una matriz primero. Piénsalo.
No uses un
foreach
declaración o transformaciones JSON. Si está planeando esto, nuevamente está trabajando con una estructura de datos, no con un objeto.Si realmente lo necesita, utilice un enfoque orientado a objetos para tener un código limpio y fácil de mantener. Por ejemplo:
Objeto como matriz
Si necesita todas las propiedades, use un objeto de transferencia:
fuente
Puede usar fácilmente esta función para obtener el resultado:
Use PHP 5 o posterior.
fuente
Aquí está mi función PHP recursiva para convertir objetos PHP en una matriz asociativa:
Ejemplo de uso:
fuente
$new_arr1 = (array) $my_object;
Para convertir un objeto en una matriz, simplemente expórtalo explícitamente:
fuente
También puede crear una función en PHP para convertir una matriz de objetos:
fuente
Es posible que desee hacer esto cuando obtenga datos como objetos de bases de datos:
fuente
Función personalizada para convertir stdClass en una matriz:
Otra función personalizada para convertir Array a stdClass:
Ejemplo de uso:
fuente
Utilizar:
Devuelve una matriz sin caracteres especiales y nombres de clase.
fuente
Esta respuesta es solo la unión de las diferentes respuestas de esta publicación, pero es la solución para convertir un objeto PHP con propiedades públicas o privadas con valores simples o matrices en una matriz asociativa ...
fuente
Algunas mejoras al código "bien conocido"
Tenga en cuenta que si la función es miembro de una clase (como arriba) debe cambiar
__FUNCTION__
a__METHOD__
fuente
También puede usar el componente serializador de Symfony
fuente
Para su caso, era correcto / hermoso si usara los patrones de "decorador" o "transformación de modelo de fecha". Por ejemplo:
Su modelo
Decorador
Uso
Entonces será un código más hermoso y más correcto.
fuente
Convertir y eliminar estrellas molestas:
Probablemente, será más barato que usar reflejos.
fuente
Solución corta de @ SpYk3HH
fuente
Dado que muchas personas encuentran esta pregunta por tener problemas para acceder dinámicamente a los atributos de un objeto, solo señalaré que puede hacer esto en PHP:
$valueRow->{"valueName"}
En contexto (salida HTML eliminada para facilitar la lectura):
fuente
Al utilizar la conversión de texto puede resolver su problema. Simplemente agregue las siguientes líneas a su objeto de retorno:
También puede agregarle un nuevo par clave y valor utilizando:
fuente
Creo que es una buena idea usar rasgos para almacenar la lógica de conversión de objeto a matriz. Un simple ejemplo:
fuente
fuente
Aquí he creado un método objectToArray () , que también funciona con objetos recursivos, como cuando
$objectA
contiene$objectB
qué puntos nuevamente$objectA
.Además, he restringido la salida a propiedades públicas usando ReflectionClass. Deshágase de él, si no lo necesita.
Para identificar objetos ya usados, estoy usando una propiedad protegida en esta clase (abstracta), llamada
$this->usedObjects
. Si se encuentra un objeto anidado recursivo, será reemplazado por la cadena**recursive**
. De lo contrario, fallaría debido al bucle infinito.fuente
$usedObjects
no se inicializa al inicio, por lo que llamar esto varias veces dará resultados incorrectos en llamadas posteriores. Además, no lo liberas al final, por lo que tus objetos nunca se eliminarán de la memoria.Ahí está mi propuesta, si tiene objetos en objetos con incluso miembros privados:
fuente
Utilizo esto (solución recursiva necesaria con las teclas adecuadas):
Ejemplo de uso, el siguiente código:
Imprimirá esto:
fuente