¿Cómo convertir una matriz multidimensional en un objeto en php?

4 minutos de lectura

Avatar de usuario de Patrioticcow
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

  • ¿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

Avatar de usuario de Charlie Schliesser
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 que array_map u otras operaciones recursivas. También en php 5.4 el json_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


Avatar de usuario de Wayne Weibel
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

¿Ha sido útil esta solución?