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

Форум PHP

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

 

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

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

тема: Как сделать что бы функция substr_count считало все вхождения
 
 автор: pazha   (26.07.2012 в 18:39)   письмо автору
 
 

Здравствуйте.

$myStr = "0,1,1,1,0,1,1,1,0";
echo substr_count( $myStr, "0,1,1,1,0" ); // 1

Как видно результат 1, а мне нужно что бы он был 2, так как такая строка встречается там два раза. Как быть в этом случае?

  Ответить  
 
 автор: confirm   (26.07.2012 в 18:43)   письмо автору
 
   для: pazha   (26.07.2012 в 18:39)
 

>так как такая строка встречается там два раза.

Нет, такая строка, а правильнее "вхождение подстроки в строку" встречается в данной строке именно один раз, так как за этим вхождением, совсем иное вхождение. substr_count() не будет возвращаться назад, и анализировать все сначала, чтобы найти еще подобное. Подобные задачи решаются с помощью регулярных выражений.

  Ответить  
 
 автор: pazha   (26.07.2012 в 18:48)   письмо автору
 
   для: confirm   (26.07.2012 в 18:43)
 

Подскажите, как это сделать? Я с регулярными выражениями совсем не знаком.

  Ответить  
 
 автор: confirm   (26.07.2012 в 18:52)   письмо автору
 
   для: pazha   (26.07.2012 в 18:48)
 

В этом разделе читайте примеры. Когда-то же надо начинать знакомиться. Хотя, возможно, что вашу задачу можно решить и без них. Для этого нужно знать:
это единственная комбинация для поиска или нет?
для решения какой задачи этот поиск?

  Ответить  
 
 автор: pazha   (26.07.2012 в 18:54)   письмо автору
 
   для: confirm   (26.07.2012 в 18:52)
 

Единственная комбинация. Для определения правильности расставления кораблей в игре морской бой (количество трёхпалубных кораблей).

  Ответить  
 
 автор: Valick   (26.07.2012 в 18:57)   письмо автору
 
   для: pazha   (26.07.2012 в 18:54)
 

http://valick.110mb.com/mb/start.php
только у меня там намеренно расстановка позволяет кораблям соприкасаться по диагонали

  Ответить  
 
 автор: pazha   (26.07.2012 в 18:58)   письмо автору
 
   для: Valick   (26.07.2012 в 18:57)
 

Не не не, я делаю именно серверную часть, мне присылают методом POST готовое поле а я проверяю что бы оно соответствовало правилам игры. Но всё равно спасибо, это тоже понадобиться

  Ответить  
 
 автор: Valick   (26.07.2012 в 18:59)   письмо автору
 
   для: pazha   (26.07.2012 в 18:58)
 

там все проверки исключительно на сервере
поиграйтесь с ручной расстановкой и с перерасстановкой после авторасстановки
скрипт можно обмануть и расставить больше кораблей, но так больше шансов проиграть
скрипт универсален для любой размерности поля и для любого количества и размерности кораблей

  Ответить  
 
 автор: pazha   (26.07.2012 в 19:05)   письмо автору
 
   для: Valick   (26.07.2012 в 18:59)
 

Я уже написал свой скрипт, он только кривовато проверяет поле ) именно поэтому я обратился сюда за помощью

  Ответить  
 
 автор: confirm   (26.07.2012 в 19:00)   письмо автору
 
   для: pazha   (26.07.2012 в 18:54)
 

Если вся запись строка, а корабль имеет окружение, и решается задача расстановки, то по логике вещей вы ищите не то, вернее вам не надо искать следующее подобное, вам нужно знать есть ли за этим вхождением пустое, и сколько пустого.

  Ответить  
 
 автор: pazha   (26.07.2012 в 19:04)   письмо автору
 
   для: confirm   (26.07.2012 в 19:00)
 

Я уже продумал про его окружение, это всё есть. Основная проблема в том что мне нужно смотреть сколько в этой строке встречаются трёхпалубных кораблей (трёхпалубный корабль это 3 еденицы поряд). А так как между ними только один нолик а не два, то функция substr_count считает их количество не совсем удачно, не так как хотелось бы. Вот с этим как бороться? Можно конечно взять тупо каждый нолик заменить на два нолика и тогда между ними будет растояние не 1 нолик а два и будет считать правильно, но как по мне это как-то по идиотски. Должно быть решение попроще.

  Ответить  
 
 автор: confirm   (26.07.2012 в 19:28)   письмо автору
 
   для: pazha   (26.07.2012 в 19:04)
 

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

  Ответить  
 
 автор: pazha   (26.07.2012 в 20:19)   письмо автору
 
   для: confirm   (26.07.2012 в 19:28)
 

Да! Именно так

  Ответить  
 
 автор: confirm   (26.07.2012 в 20:30)   письмо автору
 
   для: pazha   (26.07.2012 в 20:19)
 

Тогда я не понимаю в чем затруднения, если длина сроки фиксированная, и речь только о кораблях в три клетки...
К примеру, если это и есть полная строка:
"0,1,1,1,0,1,1,1,0";
кстати, почему через запятую?
то лучше должно быть не строка, а массив или набор бит, в первом случае легко посчитать сумму массива, по которой можно судить на сколько строка занята, а во втором случае количество единичных бит. И искать ничего не надо.

  Ответить  
 
 автор: pazha   (27.07.2012 в 15:42)   письмо автору
 
   для: confirm   (26.07.2012 в 20:30)
 

Ну я просто взял массив и переконвертировал его в строку при помощи json_encode а потом уголовые скобки заменил на нули.

  Ответить  
 
 автор: confirm   (27.07.2012 в 23:10)   письмо автору
 
   для: pazha   (27.07.2012 в 15:42)
 

Странная однако логика, превращать массив в строку, да еще при помощи json_encode, когда есть implode(), чтобы потом что-то выяснить.
Я не знаю в чем полный смысл вашего "выяснить правильную расстановку", но ведь в таком наборе:
011101110
достаточно проверить наличие 4-х последовательных единиц, и если нет, то значит гарантировано, что все расставлено верно. Стоит ли проверку такую делать, можно узнать, как я ранее говорил, по сумме значений. Если проверка, это не проверка, а знать что расставлены именно так, как на примере, тогда проверить срезы массива:
1-й срез 1-3, 2-й срез 5-7.

  Ответить  
Rambler's Top100
вверх

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