PHP и доступ к строке, как к массиву ассоциаций - PullRequest
2 голосов
/ 20 июня 2011

Это логическое поведение?

$str = 'string';  
$res = $str['some_key'];  
echo (int)isset($str['some_key']); // 1  
echo $res; // 's'  

Это ошибка или неясная функция?

Ответы [ 2 ]

10 голосов
/ 20 июня 2011

Это «фича».При использовании $string[$index], $index рассматривается как целое число, поэтому 'some_key' преобразуется в 0.Именно поэтому вы получаете 's' (первая буква $str) в $res.

$str = 'Lorem';
var_dump($str['key']); // L, because (int)'key' is 0
var_dump($str['0key']); // L
var_dump($str['1key']); // o, because (int)'1key' is 1
var_dump($str['2key']); // r
var_dump($str['3key']); // e, because (int)'3key' is 3
var_dump($str['4key']); // m
var_dump($str['5key']); // Notice:  Uninitialized string offset: 5 in sandbox\index.php on line 20
3 голосов
/ 20 июня 2011

Доступ к строкам, таким как массивы, является функцией.
Строки имеют только числовые смещения , любой используемый вами "ключ" приводится к целому числу.
Нечисловые строки, приведенные к int 0.
Следовательно, $str["foo"] эквивалентно $str[0].

Так что есть логика , хотите ли вы назвать это логика или нет, решать вам.
Но если вы получаете доступ к строкам с помощью строковых ключей, значит, с вашим кодом что-то не так. ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...