2012-07-17 10 views
27

Ho un array PHP che ha i tasti numerici come tipo di stringa.Array PHP con tasti numerici poiché la stringa non può essere utilizzata

Ma quando provo ad accedervi, PHP mi sta dando un errore indice indefinito.

$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"]); 

uscita:

 
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 

Come posso accedere a questi valori?

Demo: http://codepad.viper-7.com/8O03IM

+1

dare la reputazione 100 prima che sia scaduto. –

+8

@JosuaMarcelChrisano: ci sono 6 giorni interi prima che la taglia scada. La taglia era appena iniziata ieri. Dagli una pausa. Inoltre, non è necessario per te ricordarlo di nuovo 6 giorni dopo: il sistema lo farà. – BoltClock

risposta

27

Quindi, non ho visto nessun altro le risposte toccano questo, ma @xdazz si è avvicinato.

Cominciamo il nostro ambiente, $obj uguale la notazione oggetto di una stringa decodificata:

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) 
} 

Se si desidera accedere alle corde, sappiamo quanto segue fallirà:

php > echo $obj->1; 

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

Accesso le variabili oggetto

È possibile accedervi in ​​questo modo:

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

Che è lo stesso che dire:

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

Accesso alle variabili array

Il problema con gli array è che il seguente ritorno in bianco, che è il problema con typecasting.

php > echo $obj[1]; 
php > 

Se si typecast indietro, l'oggetto viene ancora una volta accessibile:

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

Ecco una funzione che sarà automatizzare il sopra per voi: l'utilizzo

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

Esempio:

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

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

Buona risposta .... – Petah

25

Se volete array, impostare il secondo parametro di json_decode a true.

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

Edit: quando lanci un oggetto std per array, chiave stringa numerica non gettato al numero. Ecco un esempio.

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

Grazie, questo funziona per il mio problema. Punti bonus se riesci a trovare un modo per accedere a un array con quel tipo di chiavi. – Petah

+4

@Petah Questo è il problema di php, ma è comunque possibile ottenere la chiave e il valore tramite 'foreach'. – xdazz

14

Apparentemente, si tratta di un problema noto e non ci sono piani per risolverlo; vedi Doc Bug #45959 Object to array conversion leads to weird behaviour:

fissaggio che comporta una diminuzione perfomance, quindi migliore sembra essere mantiene come problema noto, ma documentato.

Questa Wonkiness è (quindi) indicato nella documentation for the array type (sottolineatura mia):

Se un oggetto viene convertito in una matrice, il risultato è una matrice i cui elementi sono proprietà dell'oggetto. Le chiavi sono i nomi delle variabili associate, con alcune eccezioni di rilievo: proprietà interi sono inaccessibili .... Questo può causare un comportamento imprevisto ....

+1

Bella risposta! Devo dire che il casting su un array è rotto abbastanza da dichiarare una nuova regola: mai lanciare mai qualcosa su un array in PHP. –

1

Sì. Sono d'accordo, PHP ha problemi con typecasting da oggetto ad array ma foreach sta gestendo in modo intelligente l'oggetto o l'array associativo.

$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

Ho incontrato lo stesso problema di recente.

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

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

Questo codice uscite:

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

trovato che quando il debug di un metodo per convertire gli oggetti recursivly a matrice, sono stato folle.

1

Ho avuto lo stesso problema (ma con array_intersect_key).

Ecco la mia soluzione:

$array = array_combine(array_keys($array), $array); 
Problemi correlati