Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Получить первый символ строки
 
 автор: patriot   (14.09.2005 в 16:53)   письмо автору
 
 

Задано некоторое слово! С какой буквы оно начинается?
Как в PHP можно решить эту задачу?

   
 
 автор: P@Sol   (14.09.2005 в 16:57)   письмо автору
 
   для: patriot   (14.09.2005 в 16:53)
 


$text = "слово";
echo $text[0];

   
 
 автор: isset   (14.09.2005 в 17:24)   письмо автору
 
   для: P@Sol   (14.09.2005 в 16:57)
 

Лучше так, чтобы не путалось с массивами:

$text = "слово";
echo $text{0}; 

   
 
 автор: Евгений Петров   (14.09.2005 в 17:33)   письмо автору
 
   для: isset   (14.09.2005 в 17:24)
 

А ничего оно и не путается строка - это и есть массив символов.

   
 
 автор: Artem S.   (14.09.2005 в 17:57)   письмо автору
 
   для: Евгений Петров   (14.09.2005 в 17:33)
 

isset тут прав.
В php есть трабла с преоброзованием типов

Из мануала

<?php
$a 
"1";     // $a это строка
$a[0] = "f";  // А как же смещение строки? Что произойдет?
?>  



Поскольку PHP (по историческим причинам) поддерживает индексирование в строках с использованием такого же синтаксиса, как и при индексировании массива, вышеприведенный пример приводит к проблеме: следует ли $a стать массивом, первым элементом которого будет "f" или "f" должна стать первым символом строки $a?

   
 
 автор: Евгений Петров   (14.09.2005 в 18:15)   письмо автору
 
   для: Artem S.   (14.09.2005 в 17:57)
 

Не вижу проблеммы:
<?
  $a 
"l";
  
$a[0] = "f";
  
print_r($a);
?>

Легко видеть что $a не стало "ассоциативным" массивом а осталось строкой.

   
 
 автор: isset   (14.09.2005 в 18:25)   письмо автору
 
   для: Евгений Петров   (14.09.2005 в 18:15)
 

А что подумает другой программист когда увидит этот код? Ведь вы пошли проверили, не сразу сказали что останется строкой...

   
 
 автор: isset   (14.09.2005 в 18:29)   письмо автору
 
   для: isset   (14.09.2005 в 18:25)
 

Я лишь добавлю еще кусок из маунала:

 Текущая версия PHP воспринимает второе присваивание как определение смещения строки, поэтому $a станет "f", результат же этого автоматического преобразования следует, однако, рассматривать как неопределенный. В PHP 4 для доступа к символам строки был введен новый синтаксис фигурных скобок, используйте этот синтаксис вместо вышеприведенного:


И http://php.rinet.ru/manual/ru/language.types.string.php#language.types.string.substr

Замечание:  Для обеспечения обратной совместимости, вы по-прежнему имеете возможность использовать в тех же целях скобки массива. Однако, начиная с PHP 4, этот синтаксис нежелателен к использованию.


PS: Если бы вы читали мануал, у вас бы не возникло подобных "невидений проблем"

   
 
 автор: Евгений Петров   (14.09.2005 в 19:37)   письмо автору
 
   для: isset   (14.09.2005 в 18:25)
 

Ну и что что проверил? Код я привел хотя бы для того чтобы "другой программист" мог удостовериться в этом.

   
 
 автор: isset   (14.09.2005 в 19:45)   письмо автору
 
   для: Евгений Петров   (14.09.2005 в 19:37)
 

Представьте вам надо будет разобрать 200 кб пхп-кода. И вы видите запись типа $myarr['f'] =rand(0,9);
Переменная $myarr генерируется на лету (к примеру из бд берется название и потом $$varname) А теперь догадайтесь, $myarr[1] =rand(0,9); меняет элемент с индексом 1 или же второй символ в строке?

Т.е. речь не идет о том что пхп спутает, сделает из строки массив. Нет. Другой рограммист может не понять строка это или массив

[поправлено модератором]

   
 
 автор: Евгений Петров   (14.09.2005 в 19:55)   письмо автору
 
   для: isset   (14.09.2005 в 19:45)
 

С логикой у меня нормально! Из записи $myarr['f'] = rand(0,9) любой нормальный программист сразу скажет, что это НЕ строка а ассоциативный массив следовательно $myarr[1] =rand(0,9); меняет элемент с индексом 1.

Другой рограммист может не понять строка это или массив
По этому могу сказать две вещи:
Во первых переменная $myarr сама за себя говорит что это массив (от. англ array - массив), а во вторых есть такое понятие как комментарии, в которых можно извлеч много полезной информации для себя.

   
 
 автор: isset   (14.09.2005 в 20:01)   письмо автору
 
   для: Евгений Петров   (14.09.2005 в 19:55)
 

Ок, немного я не так написал, ошибся:
Представьте вам надо будет разобрать 200 кб пхп-кода. И вы видите запись типа $var[1] =rand(0,9);
Переменная $var генерируется на лету (к примеру из бд берется название и потом $$varname) А теперь догадайтесь, $var[1] =rand(0,9); меняет элемент с индексом 1 или же второй символ в строке?

Комментарии типа "меняем второй символ в строке $var на случайное число от 0 до 9 используя функцию rand" это шиза, коммент объясняет алгоритм и совершенно не должен объяснять все шаги (это (как работает $var[1] =rand(0,9) ) должен знать программист)

Представьте нет комментариев, старый программист умер уже, к БД у вас доступа нет, исходники редактировать вы тоже не можете, как тогда определить?

В мануале имеется замечание, использование [] для строк не рекомендуется. Мануалу уж можно поверить.

[поправлено модератором]

   
 
 автор: Евгений Петров   (14.09.2005 в 20:12)   письмо автору
 
   для: isset   (14.09.2005 в 20:01)
 

Ну хорошо. С вашим вариантом согласен, а теперь представьте что вы видите все тоже самое, но только вместо квадратных скобок стоят фигурные. Вы наивно поверите что это строки? Ведь для массивов так же можно использовать фигурные скобки. И все равно вам придется чесать по всему коду и смотреть что же это за переменная. Может быть такой как я специально написал там фигурные скобки вместо квадратных а може и вовсе не знал, что можно использовать квадратные.
это (как работает $var[1] =rand(0,9) ) должен знать программист
Вы противоречите сами себе. Вы мне пол часа доказываете что если б там стояли фигурные скобки то из этого можно было бы сделать заключение что это строка и в тот же момент говорите мне что программист должен знать что это за переменная и что же на самом деле.

   
 
 автор: isset   (14.09.2005 в 20:18)   письмо автору
 
   для: Евгений Петров   (14.09.2005 в 20:12)
 

хм, если честно не знал что к элементу массива можно обращаться из фигурных скобок....
Но все же , в мануале прописано, [] используется для массивов, {} используется для строк.

> Вы противоречите сами себе. Вы мне пол часа доказываете что если б там стояли фигурные скобки то из этого можно было бы сделать заключение что это строка и в тот же момент говорите мне что программист должен знать что это за переменная и что же на самом деле
Здесь немного другое, вас опять подвела логика. Каждый нормальный программист следует по мануалу, поэтому если стоит $var{1} , программист сразу поймет что здесь строка, т.к. в мануале четко прописано, что {} следует использовать только для строк.

   
 
 автор: Евгений Петров   (14.09.2005 в 20:22)   письмо автору
 
   для: isset   (14.09.2005 в 20:18)
 

В таком случае если будет стоять комент "меняем второй символ в строке $var на случайное число от 0 до 9 используя функцию rand", то каждый нормальный программист поймет, что $var - это строка.
Офтоп!

   
 
 автор: isset   (14.09.2005 в 20:26)   письмо автору
 
   для: Евгений Петров   (14.09.2005 в 20:22)
 

Кто будет делать такие комментарии? Только если по этому коду учат или кто-то так и не смог понять программирование....

Вывод:
[] - используется для обращения к элементам массива
{} - используется для обращения к символу строки
Это правило закреплено мануалом.

   
 
 автор: Евгений Петров   (14.09.2005 в 20:29)   письмо автору
 
   для: isset   (14.09.2005 в 20:26)
 

Если честно мне только что смешно стало. :) Ладно из чувства уважения к вам и авторам мануала соглашусь с вами, хотя исходя из того что не на всех хостингах есть php выше какой то там версии все же рекомендую использовать [].

   
 
 автор: isset   (14.09.2005 в 18:02)   письмо автору
 
   для: Евгений Петров   (14.09.2005 в 17:33)
 

Строка - это набор символов (с) http://php.rinet.ru/manual/ru/language.types.string.php
Массив в PHP- это упорядоченное отображение, которое устанавливает соответствие между значением и ключем. (с) http://php.rinet.ru/manual/ru/language.types.array.php

   
 
 автор: Евгений Петров   (14.09.2005 в 18:10)   письмо автору
 
   для: isset   (14.09.2005 в 18:02)
 

Вообще я имел ввиду не ассоциативный массив php, а массив такой в каком виде он хранится в памяти.

[поправлено модератором]

   
 
 автор: isset   (14.09.2005 в 18:24)   письмо автору
 
   для: Евгений Петров   (14.09.2005 в 18:10)
 

Значит вы не знаете как хранятся данные в памяти :) Только вот не понятно, что вы там в памяти нашли?
В массивах например ['5'] будет означать элемент с индексом 5,а в строке смещение относительно начала строки на 5 символов.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования