#php #arrays #element #undefined
#php #массивы #элемент #неопределенный
Вопрос:
При вызове неопределенного элемента массива он показывает мне значение другого определенного элемента.
Пример структуры массива:
$array = array(
'a' => array(
'b' => 'c'
)
);
При использовании команды echo на $array['a']['b']['x']
он показывает мне значение 'c'
. Почему это происходит, я действительно не понимаю, поскольку $array['a']['b']['x']
не определено.
И затем, когда я пытаюсь добавить другое значение с помощью command, $array['a']['b']['x'] = 'y';
оно переписывает значение $array['a']['b']
в 'y'
Почему-то я действительно не понимаю такого поведения, может кто-нибудь объяснить, как это возможно? И как тогда я смогу создать новое строковое значение в, $array['a']['b']['x'] = 'xyz'
чтобы не переопределять $array['a']['b']
?
Комментарии:
1. вы определяете 2d-массив, но пытаетесь использовать его как 3d-массив. как вы ожидаете, что это сработает?
Ответ №1:
На самом деле это вообще не связано с массивами. Это проблема со строкой.
В PHP вы можете получать доступ кобозначения массива, в котором они записаны. Рассмотрим эту строку:
$a = 'foo';
$a[0]
выдает вам первый символ ( f
), $a[1]
второй и так далее.
Присвоение строки таким образом заменит существующий символ первым символом новой строки, таким образом:
$a[0] = 'b';
приводит к $a
бытию 'boo'
.
Теперь, что вы делаете, это передаете символ 'x'
в качестве индекса. PHP преобразуется в индекс 0
(передача числа в строке, например '1'
, будет работать как ожидалось (т. Е. доступ ко второму символу)).
В вашем случае строка состоит только из одного символа ( c
). Таким образом, вызов $array['a']['b']['x'] = 'y';
такой же, $array['a']['b'][0] = 'y';
что просто изменяет символ с c
на y
.
Если бы у вас была более длинная строка, например, 'foo'
, $array['a']['b']['x'] = 'y';
, это привело бы к значению $array['a']['b']
being 'yoo'
.
Вы не можете присвоить новое значение $array['a']['b']
, не перезаписав его. Переменная может хранить только одно значение. Что вы можете сделать, так это присвоить массив $array['a']['b']
и записать предыдущее значение. Например. вы могли бы сделать:
$array['a']['b'] = array($array['a']['b'], 'x' => 'xyz');
что приведет к:
$array = array(
'a' => array(
'b' => array(
0 => 'c',
'x' => 'xyz'
)
)
);
Дальнейшее чтение:
Комментарии:
1. Очень хорошее и очень хорошо написанное объяснение! Большое вам спасибо! Определенно помогло мне избавиться от проблемы, с которой я столкнулся сейчас.