![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| APro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 328 Регистрация: 5.12.2006 Репутация: 1 Всего: 1 |
Посмотрел я немножко кодов, не совсем понял как реализовать это:
Есть фраза: «Шла Саша по шоссе», и как мне в ней посчитать количество одинаковых символов и вывести результат. Для этой фразы должен получиться такой результат:
Думаю понятно? -------------------- Никогда не спорь с дураком, другие могут не заметить между вами разницы. Чем реже открываешь рот, тем меньше слышишь глупостей. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
1. приводишь все символы к одному регистру.("шла саша по шоссе")
2. сортируешь символы в строке("аааелоопсссшшш") 3. считаешь количество повторений каждого символа.(что такое "цикл" в курсе?) |
|||
|
||||
| Dima 2015 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 16.3.2008 Где: SPb Репутация: 2 Всего: 2 |
APro, ну на рнр проще всего это сделать используя ассоциативные массивы с ключами - символами. Создаем массив, в который будем записывать результат по частоте каждой буквы, а сами буквы будут в нем ключами, пущай он будет зваться $result, ну и заводим переменную - счетчик - $counter.
Теперь тупо перебираем строку по символу, взяли символ и смотрим есть ли в нашем массиве такой ключ (ф-ция array_key_exists), если ключ есть - делаем +1 к значению элемента массива с этим ключем, если нету - присваиваем ему единицу. Взять $n-ый символ из строки - substr($str, $n, $n+1) если не путаю... В результате получим массив: $result = array ( ['ш'] => 3, ['л'] => 1, ... ); Про регистр забыл, действительно если надо не учитывать регистр то сначала строку надо в нижний, ну или в верхний регистр всю загнать... Это сообщение отредактировал(а) Dima 2015 - 26.12.2008, 23:51 |
|||
|
||||
| theworldcreator |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 362 Регистрация: 25.8.2007 Где: Москва Репутация: 10 Всего: 13 |
Я перепишу более оптимально, ты не против?) Просто в целом идея хорошая, но советы по реализации не современны
Комментарии: во первых с удивлением обнаружил что массивам нельзя назначать русские буквы в юникоде в качестве ключей. Решил работать в cp1251. Далее оказалось что strtolower() не работает с русскими символами даже в cp1251! Из этих двух проблем вытекает монструозность второй строки. И еще я не совсем уверен насколько правильно считать не объявленные элементы массива равными нулю. Но я изначально объявил $res как пустой массив(чтобы избежать проблемы с регистр глобалс, да и вообще использование этой переменной в той же области видимости), а потом у меня отработало нормально
|
||||||
|
|||||||
| Dima 2015 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 16.3.2008 Где: SPb Репутация: 2 Всего: 2 |
theworldcreator, не, абсолютно не против, я так накидал, что с ходу в голову пришло.
А по поводу кодировок, вот эти строчки спасут юникод: mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); Поставь их перед тем. как использовать mb_ - строковые и рег-эксп функции и все должно быть окей. Еще хочу извиниться, выше бред написал, $n-ый символ строки конечно же mb_substr($str, $n, 1), (считаются они от нуля). На счет подхода $str[$n], вот с ним как раз проблемы в юникоде. Я так понимаю из-за того, что за $n выступает номер байта в строке, а каждый русский символ то по 2 байта... поэтому и сделать его ключем массива не получается, ну я так понял. Так или иначе у меня вот так работает:
Array ( [ш] => 4 [л] => 2 [а] => 5 [ ] => 6 [с] => 6 [п] => 1 [о] => 3 [е] => 1 [и] => 1 [у] => 2 [к] => 1 ) Результаты совпали с theworldcreator, как физик заявляю - это редко бывает, радуемся : ))) Добавлено @ 01:24 П.С. Да, на счет array_key_exists было лишним, можно сразу к еще не определенному элементу массива ++ сделать и все окей, ну и славно... Это сообщение отредактировал(а) Dima 2015 - 27.12.2008, 01:26 |
|||
|
||||
| teroni |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 15.5.2007 Где: Днепропетровск Репутация: 8 Всего: 22 |
Ну если не пользоваться циклами, а использовать только встроенные средства для работы со строками - то можно еще немного сократить
З.Ы. С кодировками не заморачивался, у меня strtolower нормально работает и с СР1251.
Это сообщение отредактировал(а) teroni - 27.12.2008, 01:56 |
||||
|
|||||
| Dima 2015 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 16.3.2008 Где: SPb Репутация: 2 Всего: 2 |
teroni, специально сунул в скрипт сейчас ini_set("display_errors", "on"), хотя тестил на сервере, а там у меня временно и в .htaccess прописано, чтоб ошибки выводились, никаких нотайсов не видать... 0_о
Добавлено @ 02:21 teroni, А вообще твой вариант наверняка самый правильный, как я понимаю, там где можно использовать встроенные ф-ции, там надо это делать... ну почти всегда... Добавлено через 4 минуты и 21 секунду Вспомнилось высказывание... Начинающий программист использует до 100 ф-ций языка Среднего уровня - порядка 500 Профессионал - за 1000 Цифры возможно чуть наврал, но идея имеет место быть... Это сообщение отредактировал(а) Dima 2015 - 27.12.2008, 02:22 |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
насколько я знаю(и по своему опыту тоже) - это вполне решается установкой setlocale |
|||
|
||||
| theworldcreator |
|
||||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 362 Регистрация: 25.8.2007 Где: Москва Репутация: 10 Всего: 13 |
Нет, они просто скажут библиотеке mb_ какую кодировку использовать если она не указанна в функции в явном виде
Вы оказались правы, $str[0] возвращает первый значащий байт первого символа. Соответсвенно чтобы получить нормальный символ, придется извращаться:
Разумеется это не дело, ваш вариант лучше, однако оказалось что массивом все равно что у них в ключе, просто читаться будет как нечто страшное, ибо это только один байт из двух необходимых.
Вы забыли объявить его пустым
Круто, уважаю! |
||||||||||||||||
|
|||||||||||||||||
| APro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 328 Регистрация: 5.12.2006 Репутация: 1 Всего: 1 |
Всем спасибо! Код действительно работал, вот только как мне получить только цифры???
-------------------- Никогда не спорь с дураком, другие могут не заметить между вами разницы. Чем реже открываешь рот, тем меньше слышишь глупостей. |
|||
|
||||
| theworldcreator |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 362 Регистрация: 25.8.2007 Где: Москва Репутация: 10 Всего: 13 |
Включить мозг.. Все данные уже есть даже в примерах кода этой темы, а если воспользоваться поиском...
|
|||
|
||||
| APro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 328 Регистрация: 5.12.2006 Репутация: 1 Всего: 1 |
Я изучаю PHP, но в циклах и массивах мало пока что понимаю... Я не монимаю как счётчик вывести :(
-------------------- Никогда не спорь с дураком, другие могут не заметить между вами разницы. Чем реже открываешь рот, тем меньше слышишь глупостей. |
|||
|
||||
| theworldcreator |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 362 Регистрация: 25.8.2007 Где: Москва Репутация: 10 Всего: 13 |
||||
|
||||
| APro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 328 Регистрация: 5.12.2006 Репутация: 1 Всего: 1 |
А может кто ткнёт меня носом в нужную ссылку?
-------------------- Никогда не спорь с дураком, другие могут не заметить между вами разницы. Чем реже открываешь рот, тем меньше слышишь глупостей. |
|||
|
||||
| APro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 328 Регистрация: 5.12.2006 Репутация: 1 Всего: 1 |
Я правильно сделал?
-------------------- Никогда не спорь с дураком, другие могут не заметить между вами разницы. Чем реже открываешь рот, тем меньше слышишь глупостей. |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |