2012-09-01 19 views
7

Duplicar posible:
Casting an Array with Numeric Keys as an ObjectConversión a objetar una matriz indexada

Me preguntaba sobre (object) tipo de colada.

Es posible hacer muchas cosas útiles, como la conversión de una matriz asociativa a un objeto, y algunos no tan útil y un poco raro (en mi humilde opinión ) cosas, como converting a scalar value to object.

Pero, ¿cómo puedo acceder al resultado del lanzamiento de una matriz indexada?

// Converting to object an indexed array 
$obj = (object) array('apple', 'fruit'); 

¿Qué le parece el acceso a un valor específico?

print $obj[0];  // Fatal error & doesn't have and any sense 
print $obj->scalar[0]; // Any sense 
print $obj->0;  // Syntax error 
print $obj->${'0'};  // Fatal error: empty property. 
print_r(get_object_vars($obj)); // Returns Array() 

print_r($obj); /* Returns 
        stdClass Object 
        (
          [0] => apple 
          [1] => fruit 
        ) 
        */ 

Los siguientes obras porque stdClass implementos de forma dinámica y CountableArrayAccess:

foreach($obj as $k => $v) { 
    print $k . ' => ' . $v . PHP_EOL; 
} 

Respuesta

3

Esto es realmente una reported bug.

se ha considerado como "demasiado caro para arreglar" y la resolución tiene sido "informado la documentación para describir esta peculiaridad inútil, por lo que ahora es el comportamiento oficialmente correcta" [1].

Sin embargo, hay algunas soluciones .

Como get_object_vars le da nada, lo único que puede hacer es:

  1. Se puede recorrer en el stdClass usando foreach
  2. Puede echarlo hacia atrás como matriz.
  3. Puede cambiar echarlo a objeto utilizando json_decode + json_encode (esto es truco sucio)

Ejemplo 1 .:

$obj = (object) array('apple', 'fruit'); 
foreach($obj as $key => $value) { ... 

Ejemplo 2 .:

$obj = (object) array('apple', 'fruit'); 
$array = (array) $obj; 
echo $array[0]; 

Ejemplo 3.:

$obj = (object) array('apple', 'fruit');  
$obj = json_decode(json_encode($obj));  
echo $obj->{'0'}; 
var_dump(get_object_vars($obj)); // array(2) {[0]=>string(5) "apple"[1]=>string(5)"fruit"} 

Esto es por qué no debe emitir matriz no asociativo como objeto :)

Pero si se quiere, hacerlo de esta manera:

// PHP 5.3.0 and higher 
$obj = json_decode(json_encode(array('apple', 'fruit'), JSON_FORCE_OBJECT)); 
// PHP 5 >= 5.2.0 
$obj = json_decode(json_encode((Object) array('apple', 'fruit'))); 

en lugar de

$obj = (Object) array('apple','fruit'); 
+0

Gracias por responder. Sé que está sucio y nunca lanzaré un conjunto indexado ... pero tengo curiosidad :-) Estaba buscando una manera _clean_ de hacer esto, no solo una solución alternativa. Después de que [Mattew] (http://stackoverflow.com/users/259778/matthew) se dio cuenta de mi pregunta duplicada, leí la respuesta aceptada y le sugerí una edición. –

Cuestiones relacionadas