За последние 24 часа нас посетили 19163 программиста и 1641 робот. Сейчас ищут 988 программистов ...

Третий символ из строки, в чем отличия?

Тема в разделе "Прочие вопросы по PHP", создана пользователем jora, 18 сен 2013.

  1. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
    Как правильней и в чем различия?

    Код (Text):
    1. $str='12345';
    2.  
    3. echo $str[2];
    4.  
    5. echo $str{2};
    6.  
    7. echo substr($str, 2, 1);
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    первый вариант выкини как неоднозначный. остальные два правильные. когда-то давно ветренные авторы PHP решили объявить синтаксис $str{$n} как deprecated, но потом одумались и рекомендовали его к использованию. но ты можешь встретить устаревшую цитату -- не верь! )))

    разница в том, что для слишком короткой исходной строки $str{$n} выдаст Notice: Uninitialized string offset, а substr() просто вернет пустую строку.

    где-то встречал утверждение, что isset($str{0}) самый эффективный способ проверки на пустую строку
     
  3. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Во, просвятите, уважаемый, чем плох способ такого обращения?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    плох тем, что ты не видишь что имеется в виду -- элемент массива или символ строки.
    подумай как удобно, что для языка со свободной типизацией катенация строки пишется не так как сложение чисел. реально удобно! но вот с [] вышел косячек

    Добавлено спустя 3 минуты 19 секунд:
    у каждого языка своя философия. для C нормально смешивать понятия "символ строки" и "элемент массива". для PHP это не так.
     
  5. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А в чем он заключается?
    ну вот всю жизнь обращаюсь к строкам как к массивам по причине, что во всех языках это совершенно естественно, и пока не знал проблем. Какая разница, элемент массива или символ строки, если строка - это массив char-ов?
     
  6. jora

    jora Новичок

    С нами с:
    9 сен 2013
    Сообщения:
    19
    Симпатии:
    0
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    я предупреждал

    будь внимателен. в мануале упоминаются оба варианта. ты имеешь право на мнение, но не пизди, пожалуйста.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    яваскрипту этого очень не хватает...

    Добавлено спустя 47 секунд:
    смотря что подразумевается под чаром
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    у строки тип "строка". она почти в 100% операций и функций интерпретируется не так, как массив (говорю про PHP). примеры можешь сам придумать и испытать.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Да, постоянно приходится писать и на php и на JavaScript, и начинаешь путаться, где + использовать, а где точку...
     
  11. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    один символ в заданной кодировке.
    Это всего лишь подмножество массивов. Выражение $string_var[0] ничем не хуже любого другого. Рассуждения, что хуже, что лучше в этом плане - это, как по мне, субъективные предрассудки.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пока в пхп это один байт. пока.
     
  13. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    неа :) strlen() для двубайтовой кодировки вернет для слова "кот" длину, равную 6 :) Так что char это не один байт, это именно символ.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а $str[0]?

    Добавлено спустя 17 секунд:
    а функции-резалки?
     
  15. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А str[0] вернет нулевой символ. Даже если он из двух байт состоит.
    тоже адекватно скачут по символам. Не половинят :)
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Половинят
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    LOL. приведи пример где в PHP строка работает как массив. учи нас!
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    {ВЫ}\s[о]\s(чем)<?:)php>
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пробуем
    Код (PHP):
    1. $s = "ыдв";
    2. var_dump($s[0], $s[0] . $s[1]); 
    получаем
    Код (Text):
    1. string '�' (length=1)
    2. string 'ы' (length=2)
    Добавлено спустя 4 минуты 17 секунд:
    вобщем, учитывая намерения перевести пхп на мультибайтные кодировки нативно, есть надежда, что {} будет возвращать символ, а [] в свою очередь байт
     
  20. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    хм, шьйорт побъерхи, знач я тупанул чего-то. И правда половинится. Спасибо.
    надеемся, что и [] будет давать символ, потому что байт в строке никому нафиг не нужен, имхо. Ну и по факту разницы между [] и {} никакой, а говорили что хуже, хуже.
    Обращение через [] к указанной ячейке памяти. PHP под капотом держит Си. В Си строк нет как таковых. Но есть массивы char. Строки в пхп обрабатываются довольно быстро, что наводит на мысль использования нативных сишных возможностей оперирования памятью, а не тонной костылей.
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Речь о PHP. Он кардинально отличается от Си. На чем написан сам интерпретатор роли не играет.
    Ты понимаешь, что массивы PHP тоже не имеют ничего общего с массивами Си? Он родственник "хешей" в Perl и Python, а нифига не Сишный массив.
    Вобщем просто признай, что сказал хуйню. Все кто в теме это и так поняли :)
     
  22. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну раз
    , то окай, признаю, что сказал хуйню)
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
  24. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Та я не гордый в этом плане. Если оказываюсь в итоге не прав - yсирaться не вижу смысла.
    а вот за это спасибо.

    Добавлено спустя 8 минут 45 секунд:
    Прочел и...

    1) если массив в PHP и так является двусвязным списком, то какого черта нельзя делать вставку в середину? О_о
    2) понял природу одного занятного бага в проекте, связанного именно точками расширения массивов.
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да, это вопрос.