За последние 24 часа нас посетил 21921 программист и 1003 робота. Сейчас ищут 686 программистов ...

Почему значение переменной стало 12??

Тема в разделе "PHP для новичков", создана пользователем Drobotko Taras, 23 окт 2017.

  1. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Добрый вечер. Вот 3 строки кода:
    PHP:
    1. $a = "1";
    2. $a[$a] = "2";
    3. echo $a;
    Не могу понять, почему виводится значение 12 переменной $a. То есть, строки соединились? Объясните, пожалуйста, если можно.
     
    #1 Drobotko Taras, 23 окт 2017
    Последнее редактирование: 23 окт 2017
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А ты понял, что ты тут сделал?

    Строка в PHP позволяет обращаться с собой как с массивом байт, в некотором приближении. И что у нас получается? Ты сказал PHP:
    1) Возьми строку "1".
    2) Запиши в байт номер 1 цифру "2".
    3) Длина строки - один однобайтовый символ. Единичка - это нулевой байт. Первый байт следует сразу за ней. Туда ты записал двойку.

    Получилось... 12!
     
    #2 Fell-x27, 23 окт 2017
    Последнее редактирование: 23 окт 2017
  3. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Удивительно. Большое спасибо за пояснение!
     
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    только это с кирилицей не работает)) кирилица вроде больше одного байта в utf8 занимает..
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Не только кириллица. Любой многобайтовый алфавит или многобайтовая кодировка будет ломаться, если ковырять строки побайтово.

    По этому для манипуляций со строками надо пользоваться специальными функциями и из mb_, то бишь мультибайтовыми, аналогами. Списки их есть в документации.
     
    Алекс8 нравится это.