2012-07-17 11 views
27

Tengo una matriz de PHP que tiene teclas numéricas como tipo de cadena.matriz de PHP con teclas numéricas ya que la cadena no se puede usar

Pero cuando intento acceder a ellos PHP me da un error de índice indefinido.

$a = (array)json_decode('{"1":1,"2":2}'); 
var_dump($a); 
var_dump(isset($a[1])); 
var_dump(isset($a["1"])); 
var_dump($a[1]); 
var_dump($a["1"]); 

Salida:

 
array (size=2) 
    '1' => int 1 
    '2' => int 2 

boolean false 

boolean false 

ERROR: E_NOTICE: Undefined offset: 1 

null 

ERROR: E_NOTICE: Undefined offset: 1 

null 

¿Cómo accedo a estos valores?

Demostración: http://codepad.viper-7.com/8O03IM

+1

dan la reputación 100 antes de que está caducado. –

+8

@JosuaMarcelChrisano: hay 6 días completos antes de que caduque la recompensa. La recompensa recién comenzó ayer. Dale un descanso. Además, no es necesario que se lo recuerde de nuevo 6 días después; el sistema lo hará. – BoltClock

Respuesta

27

Por lo tanto, no he visto ningún otro las respuestas tocan esto, pero @xdazz estuvo cerca.

Vamos a empezar nuestro entorno, $obj es igual a la notación de objetos de una cadena decodificada:

php > $obj = json_decode('{"1":1,"2":2}'); 

php > print_r($obj); 
stdClass Object 
(
    [1] => 1 
    [2] => 2 
) 

php > var_dump($obj); 
object(stdClass)#1 (2) { 
    ["1"]=> 
    int(1) 
    ["2"]=> 
    int(2) 
} 

Si desea acceder a las cuerdas, sabemos lo siguiente fallará:

php > echo $obj->1; 

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `'{'' or `'$'' in php shell code on line 1 

Acceso las variables de objeto

Puede acceder a ella como tal:

php > echo $obj->{1}; 
1 

cual es lo mismo que decir:

php > echo $obj->{'1'}; 
1 

Acceso a las variables de matriz

El problema con las matrices es que la siguiente declaración en blanco, que es el problema con el encasillamiento.

php > echo $obj[1]; 
php > 

Si encasillado de nuevo, el objeto es una vez más accesible:

php > $obj = (object) $obj; 
php > echo $obj->{1}; 
1 

Aquí es una función que automatizará lo anterior para usted: el uso

function array_key($array, $key){ 
    $obj = (object) $array; 
    return $obj->{$key}; 
} 

Ejemplo:

php > $obj = (array) $obj; 
php > echo array_key($obj, 1); 
1 

php > echo array_key($obj, 2); 
2 
+1

Buena respuesta .... – Petah

25

Si desea matriz, establecer el segundo parámetro de json_decode a true.

$a = json_decode('{"1":1,"2":2}', true); 

Editar: cuando lanzas un objeto std a la matriz, llave cadena numérica no se echó a número. Aquí hay un ejemplo.

$obj = new stdClass; 
$obj->{'1'} = 1; 
$arr = (array) $obj; 
var_dump($arr); 
var_dump(isset($arr[1])); 
+0

Gracias, esto funciona para mi problema. Sin embargo, si aún puede encontrar una forma de acceder a una matriz con ese tipo de claves. – Petah

+4

@Petah Este es el problema de php, pero aún se puede obtener la clave y el valor a través de 'foreach'. – xdazz

14

Aparentemente, este es un problema conocido, y no hay planes para solucionarlo; ver Doc Bug #45959 Object to array conversion leads to weird behaviour:

Fijación que implica una disminución del rendimiento, por lo tanto, lo mejor parece ser mantenerlo como un problema conocido, pero documentado.

Este wonkiness es (a continuación) se señaló en el (énfasis mío) documentation for the array type:

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: propiedades enteros son inaccesibles .... Esto puede resultar en un comportamiento inesperado ....

+1

¡Buena respuesta! Tengo que decir que el lanzamiento a una matriz está lo suficientemente roto como para declarar una nueva regla: nunca lanzar nada a una matriz en PHP. –

1

Sí. Estoy de acuerdo, PHP tiene problemas con la conversión de tipo de objeto a matriz, pero foreach está manejando inteligentemente el objeto o matriz asociativa.

$a = json_decode('{"1":1,"2":2}'); //need not typecast but doesnt break even if u typecast 

foreach ($a as $k=>$v){ 
    echo $v; 
} 
1

Me encontré con el mismo problema recientemente.

$obj = new stdClass(); 
$obj->{'0'} = "test"; 

$array = (array)$obj; 
foreach ($array as $key => $value) { 
    $array[$key] = strtoupper($value); 
} 
var_dump($array); 

Este código salidas:

array(2) { 
    ["0"]=> 
    string(4) "test" 
    [0]=> 
    string(4) "TEST" 
} 

encontrado que cuando la depuración de un método para convertir objetos recursivamente a la matriz, he estado loco.

1

Tuve el mismo problema (pero con array_intersect_key).

Aquí está mi solución:

$array = array_combine(array_keys($array), $array); 
Cuestiones relacionadas