Vaca patriótica
tengo una matriz multidimensional:
$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image);
la bruja se parece a esto:
[_media_path:protected] => Array
(
[main_thumb] => http://example.com/e4150.jpg
[main_large] => http://example.com/e4150.jpg
[secondary] => Array
(
[0] => http://example.com/e4150.jpg
[1] => http://example.com/e4150.jpg
[2] => http://example.com/e9243.jpg
[3] => http://example.com/e9244.jpg
)
)
y me gustaría convertirlo en un objeto y conservar los nombres clave.
¿Algunas ideas?
Gracias
editar: $obj = (object)$image_path;
no parece funcionar necesito una forma diferente de recorrer la matriz y crear un objeto
charlie schliesser
Una forma rápida de hacer esto es:
$obj = json_decode(json_encode($array));
Explicación
json_encode($array)
convertirá toda la matriz multidimensional en una cadena JSON. (php.net/json_encode)
json_decode($string)
convertirá la cadena JSON en una stdClass
objeto. si pasas TRUE
como segundo argumento para json_decode
, obtendrá una matriz asociativa de vuelta. (php.net/json_decode)
No creo que el rendimiento aquí frente a pasar recursivamente por la matriz y convertir todo sea muy notable, aunque me gustaría ver algunos puntos de referencia de esto. Funciona, y no va a desaparecer.
-
Esta debería ser la respuesta, ya que el OP quiere la matriz multidimensional completa, no la matriz de nivel superior.
– AeroCross
9 oct 2012 a las 14:43
-
Yo diría que esta es una forma lenta de hacerlo. Si el rendimiento es una preocupación, evitaría esta solución.
– CalebTaylor
27 de febrero de 2013 a las 15:43
-
eso es impresionante… Gracias.
– Nishant
21 de enero de 2015 a las 11:14
-
De hecho, comparé este código con php 7.2 ->
json_decode
es 5 veces más rápido quearray_map
u otras operaciones recursivas. También en php 5.4 eljson_decode
La solución es la opción más rápida que pude encontrar. ¡Gran respuesta!– Felipe
12/07/2018 a las 20:54
-
@ Mirceac21 su objeto puede implementar JsonSerializable para definir cómo se convierte.
–Charlie Schliesser
21 de agosto de 2018 a las 14:37
Wayne Weibel
La mejor manera sería administrar su estructura de datos como un objeto desde el principio si tiene la capacidad:
$a = (object) array( ... ); $a->prop = $value; //and so on
Pero la forma más rápida sería el enfoque proporcionado por @CharlieS, usando json_decode(json_encode($a))
.
También puede ejecutar la matriz a través de una función recursiva para lograr lo mismo. No he comparado esto con el enfoque json pero:
function convert_array_to_obj_recursive($a) {
if (is_array($a) ) {
foreach($a as $k => $v) {
if (is_integer($k)) {
// only need this if you want to keep the array indexes separate
// from the object notation: eg. $o->{1}
$a['index'][$k] = convert_array_to_obj_recursive($v);
}
else {
$a[$k] = convert_array_to_obj_recursive($v);
}
}
return (object) $a;
}
// else maintain the type of $a
return $a;
}
Espero que ayude.
EDITAR: json_encode + json_decode creará un objeto como se desee. Pero, si la matriz era índices numéricos o mixtos (p. array('a', 'b', 'foo'=>'bar')
), no podrá hacer referencia a los índices numéricos con notación de objeto (por ejemplo, $o->1 o $o[1]). la función anterior coloca todos los índices numéricos en la propiedad ‘índice’, que en sí misma es una matriz numérica. Entonces, entonces serías capaz de hacer $o->index[1]
. Esto mantiene la distinción de una matriz convertida de un objeto creado y deja la opción de fusionar objetos que pueden tener propiedades numéricas.
-
Gracias por proporcionar la función recursiva, creo que probablemente sea útil para muchas personas que se topan con esto. Voy a comprobar el código fuente de PHP para ver cómo json_encode/decode se compara en términos de rendimiento. Soy curioso.
–Charlie Schliesser
23 de diciembre de 2013 a las 4:40
-
Puede hacer referencia a las propiedades numéricas de los objetos a través de
$o->{1}
.–Charlie Schliesser
04/02/2014 a las 15:35
¿Puedes darnos un mejor ejemplo de cómo quieres que se vea el objeto? ¿Quieres convertir las claves en propiedades? ¿Para qué necesitas un objeto?
– mpen
7 de febrero de 2012 a las 1:38
En lugar de usar
[]
para obtener el valor que necesito usar->
– Vaca patriótica
7 de febrero de 2012 a las 1:42