2011-12-03 16 views
5

Mam dziwny problem z funkcją isset() w PHP. Pozwól mi pokazać ....php isset() na zmiennej łańcuchowej używającej ciągu jako indeksu

<?php 

$aTestArray = array(
    'index' => array(
     'index' => 'Główna' 
    ), 
    'dodaj' => 'Dodaj ogłoszenie', 
); 

var_dump(isset($aTestArray['index'])); 
var_dump(isset($aTestArray['index']['index'])); 
var_dump(isset($aTestArray['dodaj'])); 

var_dump(isset($aTestArray['index']['none'])); 
var_dump(isset($aTestArray['index']['none']['none2'])); 

// This unexpectedly returns TRUE 
var_dump(isset($aTestArray['dodaj']['none'])); 
var_dump(isset($aTestArray['dodaj']['none']['none2'])); 


?> 

var_dump powróci:

bool(true) 
bool(true) 
bool(true) 

bool(false) 
bool(false) 
bool(true) 
bool(false) 

Dlaczego szósty var_dump() zwraca TRUE?

Odpowiedz

12

Podczas korzystania z operatorów [] na łańcuchu, będzie oczekiwać wartości całkowitej. Jeśli go nie dostanie, przekonwertuje go. ['none'] jest konwertowany na [0], który w Twoim przypadku to D.

+0

Niepoprawnie. Jedną z najlepszych cech PHP jest to, że _daje_ dopuszcza klucze łańcuchowe; '['none']' jest poprawną nazwą klucza. – Bojangles

+1

+1 Dobrze wyjaśnić, że użycie '[]' na łańcuchu próbuje uzyskać dostęp do jego znaków jako komponentów tablicy. –

+1

@JamWaffles Absolutnie! Ale właśnie wtedy pracujemy z tablicami asocjacyjnymi. W tym przypadku robimy coś w rodzaju 'Dodaj ogłoszenie '[' none ']', które nie obsługuje nazwanych kluczy. –

1

to dlatego, że PHP jest napisany w C. Tak więc od $ aTestArray [ 'dodaj'] jest ciąg:

$aTestArray['dodaj']['none'] 

jest taka sama jak

$aTestArray['dodaj'][0] 

ponieważ

var_dump((int) 'none') 

to 0

+0

Ta odpowiedź byłaby o wiele bardziej użyteczna, gdyby została zmieniona na komentarz wyjaśniający odpowiedź Toma. –