Вызов неопределенного элемента массива показывает значение другого определенного элемента

#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. Очень хорошее и очень хорошо написанное объяснение! Большое вам спасибо! Определенно помогло мне избавиться от проблемы, с которой я столкнулся сейчас.