2011-08-10 17 views
5

Tenemos una matriz de las cuales las claves son cadenas, pero esas cadenas a veces solo son números (por ejemplo, "123"). Al intentar acceder al conjunto con la tecla "123", obtenemos un aviso de índice no definido. Al acceder solo por el número entero 123, obtenemos el aviso de Desviación no definida. Esto nos dice que estamos tratando de indexarlo correctamente usando la cadena "123", pero aún no está configurado.Acceso matriz por cadena clave x, donde x es "123"

Tratando de encontrar un ejemplo para esta pregunta SO, esto es difícil, ya que PHP convierte las teclas de matriz en nuestro caso de prueba en enteros automáticamente, mientras que en nuestra aplicación real esto no sucede (debido al uso de Java Puente). La matriz de prueba que estamos tratando ahora es:

<?php 
$array = array("123" => array(108, 8)); 
var_dump($array); 
?> 

Esto devuelve:

array(1) { [123]=> array(2) { [0]=> int(108) [1]=> int(8) } } 

Mientras que en nuestro equivalente del mundo real, sería volver:

array(1) { ["123"]=> array(2) { [0]=> int(108) [1]=> int(8) } } 

Así que en lo real mundo el índice en realidad es una cadena:

<?php 
var_dump(array_keys($array)); 
?> 

vuelve

array(1) { [0]=> string(3) "123" } 

Así que, finalmente, la pregunta es la salida del siguiente código:

<?php 
foreach ($array as $key => $value) { 
    if (!isset($array[$key])) { 
     print "What is happening here?"; 
    } 
} 
?> 

que da:

What is happening here? 

Basado en el comentario de Yoshi, aquí está funcionando código de prueba:

<?php 
$array = (array)json_decode('{"123":[108,8]}'); 
foreach ($array as $key => $value) { 
    if (!isset($array[$key])) { 
     print "What is happening here?"; 
    } else { 
     print "Nothing to see here, move along"; 
    } 
} 
?> 
+1

no le puede ayudar en la respuesta a su pregunta. Pero si usa '$ array = (array) json_decode ('{" 123 ": [108,8]}');' Obtendrá su ejemplo en el mundo real (teniendo '123 'como una clave de cadena). Tal vez esto ayude a otros a reproducir el problema. – Yoshi

+0

(referencia) http: // codepad.org/ewMJyKDU Creo que esta es una pregunta realmente interesante. Y con suerte, alguien puede compartir algo de luz sobre el comportamiento. – Yoshi

Respuesta

2

solución no muy elegante también, sino que también trabaja y no requieren volver a crear la matriz. Además, puede acceder al valor del elemento.

$array = (array)json_decode('{"123":100}'); 
$array_keys = array_keys($array); 
$array = (object)$array; 

foreach ($array_keys as $key) 
{ 

    if (!isset($array->$key)) 
    { 
     print "What is happening here?"; 
    } 
    else { 
     print "It's OK val is {$array->$key}"; 
    } 
} 

Nota $ antes de clave en $array->$key, es importante.

+0

Perdón por la aceptación tardía, por fin lo revisé. De hecho, no es muy elegante, pero funciona. – drvdijk

1

Mira esto código (y la línea $array[(string)$key])

<?php 
$array = array("123" => array(108, 8)); 

foreach ($array as $key => $value) 
{ 
    if (!isset($array[(string)$key])) 
    { 
     print "What is happening here?"; 
    } 
    else print "It's just types"; 
} 

tipo de clave $ se coló de forma automática a un entero, y es por eso que esta clave no se ha encontrado en la matriz.

Toda la información al respecto se puede encontrar en el manual: http://php.net/manual/en/language.types.type-juggling.php

Este código sirve para las casos:

foreach ($array as $key => $value) 
{ 
    if (!array_key_exists($key, $array)) 
    { 
     print "What is happening here?"; 
    } 
    else print "It's just types"; 
} 
+1

Intenta usar '$ array = (array) json_decode ('{" 123 ": [108,8]}');'. Imprimirá '¿Qué está pasando aquí?'. – Yoshi

+0

@Yoshi has probado? Muestra "Es solo tipos". Y json_decode tiene un segundo argumento para devolver la matriz. –

+0

Lo hemos intentado. Muestra "¿Qué está pasando aquí?". Hemos actualizado la pregunta con el código de prueba que usamos. – drvdijk

0

Tuve el mismo problema (pero con array_intersect_key).

Aquí está mi solución:

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