Делаем это:
$test['hello'] = "Hello There";
Вы заявляете, что $test['hello']
содержит строку.
Затем делаем это:
$test['hello']['jerk'] = "JERK!";
Вы заявляете, что $test['hello']
содержит массив; и больше не строка.
Ваш $test['hello']
может содержать только одну вещь.
На самом деле, когда вы делаете это:
$test['hello']['jerk'] = "JERK!";
Поскольку $test['hello']
содержит строку (а не массив) , я думаю, PHP попытается получить доступ к этой записи: $test['hello'][0]
Если 0
- строка jerk
, преобразованная в целое число.
И $test['hello'][0]
означает первый символ строки в $test['hello']
См. Доступ к строке и ее модификация с помощью символа в руководстве, об этом.
Теперь вы пытаетесь поместить целую строку ("JERK!"
), где может быть только один символ - первый из существующей строки. И тот переопределяется первым символом строки "JERK!"
.
РЕДАКТИРОВАТЬ через некоторое время: и вот полные пояснения с комментарием кода:
// Assign a string to $test['hello']
$test['hello'] = "Hello There";
//Echo Value
var_dump($test['hello']);
// Try to assign a string to $test['hello']['jerk']
$test['hello']['jerk'] = "JERK!";
// But $test['hello'] is a string, so PHP tries to make a string-access to one character
// see http://fr.php.net/manual/en/language.types.string.php#language.types.string.substr
// As 'jerk' is a string, it gets converted to an integer ; which is 0
// So, you're really trying to do this, here :
$test['hello'][0] = "JERK!";
// And, as you can only put ONE character where ($test['hello'][0]) there is space for only one ,
// only the first character of "JERK!" is kept.
// Which means that what's actually done is :
$test['hello'][0] = "J";
// Still echo the whole string, with the first character that's been overriden
var_dump($test['hello']);
// Same as before : here, you're only accessing $test['hello'][0]
// (which is the first character of the string -- the one that's been overriden)
var_dump($test['hello']['jerk']);
// Same as this :
var_dump($test['hello'][0]);