2012-02-07 25 views
10

tengo una matriz multidimensional:cómo convertir una matriz multidimensional a objeto en php?

$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image); 

bruja se ve así:

[_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 retener los nombres de las teclas.

¿Alguna idea?

Gracias

edición: $obj = (object)$image_path; no parece funcionar. Necesito una manera diferente de bucle a través de la matriz y la creación de un objeto

+0

¿puede darnos un mejor ejemplo de cómo quiere que se vea el objeto? ¿Quieres convertir las llaves en propiedades? ¿Para qué necesitas un objeto? – mpen

+0

en lugar de usar '[]' para obtener el valor que necesito para usar '->' – Patrioticcow

Respuesta

71

Una forma rápida de hacer esto es:

$obj = json_decode(json_encode($array)); 

Explicación

json_encode($array) convertirá toda la matriz multidimensional para una cadena JSON. (php.net/json_encode)

json_decode($string) convertirá la cadena JSON en un objeto stdClass. Si pasa TRUE como segundo argumento al json_decode, obtendrá una matriz asociativa. (php.net/json_decode)

No creo que el rendimiento aquí vs recursivamente pasando por la matriz y la conversión de todo es muy notable, aunque me gustaría ver algunos puntos de referencia de esto. Funciona, y no va a desaparecer.

+2

Esta debería ser la respuesta, ya que OP quiere la matriz multidimensional completa, no la matriz de nivel superior. – AeroCross

+1

Diría que esta es una forma lenta de hacerlo.Si el rendimiento es una preocupación, evitaría esta solución. –

+0

@CalebTaylor - Te escucho. No estoy seguro de los puntos de referencia, pero tengo curiosidad por saber si existe una diferencia no trivial entre iterar recursivamente sobre una matriz multidimensional y agregar a un objeto (es decir, hacer todo esto a mano) o simplemente ejecutar el truco JSON anterior. . –

6

La mejor forma sería la de gestionar su estructura de datos como un objeto desde el principio, si usted tiene la capacidad de:

$a = (object) array(...); $a->prop = $value; //and so on 

Pero la forma más rápida sería el enfoque suministrada por @CharlieS, utilizando 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.

EDIT: json_encode + json_decode creará un objeto como desee. Pero, si la matriz era de índices numéricos o mixtos (por ejemplo, array('a', 'b', 'foo'=>'bar')), no podrá hacer referencia a los índices numéricos con la notación de objetos (por ejemplo, $ o-> 1 o $ o [1]). la función anterior coloca todos los índices numéricos en la propiedad 'index', que es en sí misma una matriz numérica. entonces, entonces podría hacer $o->index[1]. Esto mantiene la distinción de una matriz convertida a partir de un objeto creado y deja la opción de fusionar objetos que pueden tener propiedades numéricas.

+0

Gracias por proporcionar la función recursiva, creo que probablemente sea útil para mucha gente que se tropieza con esto. Voy a verificar el código fuente de PHP para ver cómo se compara json_encode/decode en términos de rendimiento. Soy curioso. –

+1

Puede hacer referencia a propiedades numéricas en objetos a través de '$ o -> {1}'. –

Cuestiones relacionadas