Я знаю, что можно добавлять / изменять элементы массива следующим образом:
$a = ['zero', 'one', 'two']; //first create array
$a[4] = 'four';
$a[] = 'three';
Здесь я создал массив перед его изменением, используя []
, Но что произойдет, если я сначала не создам переменную с массивом? Будет ли новый массив создан и назначен переменной автоматически?
$b[2] = 'two'; // will create array?
$c[] = 'zero'; // will create array?
echo $d[1]; // will create array?
$b[2] = 'two';
создаст массив.
$c[] = 'zero';
создаст массив.
echo $d[1];
выдаст предупреждение о неопределенной переменной $ d или предупреждение о неопределенном смещении 1, если $ d существует, но $ d [1] нет.
Не делай этого.
Это правда, что $array[1] = 'foo';
создаст массив но не всегда.
Если у вас уже есть переменная $array
тогда вы не получите новый массив.
Краткий ответ на ваш вопрос: да, если вы доступ к нему для записи, PHP создаст массив но не всегда!
Чтобы быть более конкретным:
$b[2] = 'two';
— создаст массив и сохранит строку two
на ключ 2
;$c[] = 'zero';
— создаст массив и сохранит строку zero
на ключ 0
;echo $d[1]
— НЕ будет создавать массив; и это НЕ создаст $d[1]
если $d
уже является массивом, но у него нет ключа 1
,Вы можете проверить все это для себя, используя print_r()
или же var_dump()
.
Позвольте мне показать вам, что происходит, когда вы игнорируете этот совет и полагаетесь на то, что PHP выполнит инициализацию за вас:
// Skip over the initialization of $a, PHP will do it for you
$a[1] = 'a';
$a = array_merge($a, array('b'));
print_r($a);
Этот код даст ожидаемый результат:
Array
(
[0] => a
[1] => b
)
Теперь, скажем, несколько сотен строк кода выше в той же функции, код выглядит так:
// Somewhere on top of the function (or file, if not in a function)
$a = 'blah';
$b = $a.', blah';
// there is no need for $a below this line but we don't bother
// to unset it, PHP will do it anyway at the end of the function
// ...
// a lot of code here that doesn't use $a
// ...
// several hundreds of lines below
// ...
// you forgot completely about the code on top
// ...
// and write new code as below:
// Skip over the initialization of $a, PHP will do it for you
$a[1] = 'a';
array_merge($a);
К сожалению, array_merge()
не удалось с сообщением PHP Warning: array_merge(): Argument #1 is not an array
,
Вы ожидаете, что PHP создаст для вас массив, потому что вы использовали $a
лайк $a[1] = 'b';
Но PHP не работает таким образом!
Это не может угадать, о чем ты думаешь. переменная $a
уже существовал (он был создан поверх функции, и никто не отменял его) и содержал строку. Потому что запись $a[1] = 'b';
является допустимым способом изменения одного символа строки, PHP только что сделал это, совершенно не подозревая, что вы хотите создать массив.
Всегда, но всегда инициализируйте ваши переменные непосредственно перед их использованием. Никогда не ожидайте, что PHP или некоторые феи сделают это за вас. Может быть, они делают это сейчас, но завтра могут передумать, и вдруг ваш код перестанет работать или начнет давать плохие результаты.