Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Поиск одинаковых значений в строке
Форумы портала PHP.SU » PHP » Программирование на PHP » Поиск одинаковых значений в строке

Страниц (1): [1]
 

1. DarkLan - 06 Сентября, 2016 - 18:37:00 - перейти к сообщению
Добрый вечер.
Если ли возможность найти одинаковые (числа, слова) в строке?
Например:
PHP:
скопировать код в буфер обмена
  1.  
  2. $text = "10 20 30 40 50 20 100 200";
  3.  


Спасибо.
2. Строитель - 06 Сентября, 2016 - 21:11:51 - перейти к сообщению
DarkLan пишет:
Если ли возможность найти одинаковые (числа, слова) в строке?
PHP:
скопировать код в буфер обмена
  1. function findSubstr($text, $substr) {
  2.     return mb_substr_count(mb_strtolower($text), $substr);
  3. }
  4. // Вывод количества совпадений подстроки в строке
  5. echo findSubstr('Текст, ещё текст, и ещё текст', 'текст');// 3
  6.  
  7.  
  8. function findNumber($text, $numb) {
  9.     preg_match_all('~\d+~', $text, $numbers);
  10.     $result = array_count_values($numbers[0]);
  11.     return $result[$numb];
  12. }
  13. // Вывод количества совпадений числа в строке
  14. echo findNumber('10 20 30 40 50 20 100 200', 20);// 2
3. DarkLan - 06 Сентября, 2016 - 23:16:51 - перейти к сообщению
То, что вы написали - можно сделать меньшим кодом. У вас суть поиска по константе. В первом случаем - это ТЕКСТ, другой - 20. Суть вопроса не в том, что бы найти что-то в строке или массиве, а в том, что бы найти совпадения в строке, которая динамическая и по какому-то регулярному выражению искать не получится (у меня нет идей, как по регулярке это можно реализовать).

Прошу пишите свои идеи, код не так важен, как понять суть реализации этого.
4. Строитель - 07 Сентября, 2016 - 19:51:01 - перейти к сообщению
DarkLan пишет:
То, что вы написали - можно сделать меньшим кодом
Возможно, я и не претендую на мистера "Компактный код", пишу как умею на данный момент, и разумеется, пытаюсь самосовершенствоваться Улыбка
DarkLan пишет:
У вас суть поиска по константе. В первом случаем - это ТЕКСТ, другой - 20.
Абсолютно верно.
DarkLan пишет:
Суть вопроса не в том, что бы найти что-то в строке или массиве, а в том, что бы найти совпадения в строке
Ну, вы ведь в первом посту не так подробно описали суть задачи, поэтому и был предложен такой вариант.
DarkLan пишет:
по какому-то регулярному выражению искать не получится (у меня нет идей, как по регулярке это можно реализовать)
Значит вы плохо разбираетесь в механизме регулярных выражений, т.к. у меня есть идеи их использования в вашей задаче
DarkLan пишет:
Прошу пишите свои идеи, код не так важен, как понять суть реализации этого.
Есть хорошее выражение, процитирую: "Болтовня ничего не стоит - покажите мне код". Я не буду описывать алгоритм решения, вы его и сами прекрасно сможете прочитать из моего кода. В этом его варианте поиск совпадений не привязан к константным значениям
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. function findMatch($text) {
  4.     $text = mb_strtolower($text, 'UTF-8');
  5.     preg_match_all('~\d+|[^\d\s,?\.]+~u', $text, $numbers);
  6.     $values = array_count_values($numbers[0]);
  7.     $result = '<table><tr><th>Значения'.
  8.         '</th><th>Повторы</th></tr>';
  9.     foreach ($values as $val => $sum) {
  10.         if ($sum > 1) {
  11.             $result .= '<tr><td>'. $val .'</td><td>'. $sum .'</td></tr>';
  12.             $bool = true;
  13.         }
  14.     }
  15.     $result .= '</table>';
  16.    
  17.     return (isset($bool) ? $result : false);
  18. }
  19.  
  20. $str = 'Текст, ещё текст, и ещё текст, и какое-то число, например 7 '.
  21.     '10 20 30 40 50 20 100 200';
  22.  
  23. echo findMatch($str);
  24. /*
  25.     Значения Повторы
  26.     текст    3
  27.     ещё      2
  28.     и        2
  29.     20       2
  30. */
  31.  
5. dcc0 - 07 Сентября, 2016 - 22:22:29 - перейти к сообщению
Как идея:
1 ) Разбить на массив - explode
2 ) array_count_values
3 ) Потом в полученном массиве показать то, что в значнии больше 1
В принципе все.
6. Строитель - 07 Сентября, 2016 - 22:54:19 - перейти к сообщению
dcc0 пишет:
Разбить на массив - explode
В таком случае придётся ещё как-то обрабатывать знаки препинания, т.к подстроки вида "текст," или "текст." (и т.п.) не будут учитываться в сравнении. Именно поэтому я использовал регулярные выражения. Ну а в остальном ваш алгоритм не отличается от моего )
7. DarkLan - 08 Сентября, 2016 - 01:35:55 - перейти к сообщению
dcc0
Ни в коем случаем не хотел оскорбить.

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

Цитата:
Болтовня ничего не стоит - покажите мне код
Суть вопроса в коде. Писать говно-код не очень хорошо, а если идеи нет как это реализовать - тогда только говно-код и получается.
8. Строитель - 08 Сентября, 2016 - 02:00:14 - перейти к сообщению
DarkLan пишет:
Ваш вариант испытаю на практике, логика понятна. Спасибо.
При необходимости в шаблон регулярного выражения добавите ещё символов (например, воскл. знак, он ведь может встретиться в тексте).
(Добавление)

DarkLan, я не знаю, для каких целей вам было нужно это решение, но когда я продемонстрировал его результат своей жене, она сказала, что этот код ей понадобится при копипасте больших текстов - там как раз нужно проверять часто встречающиеся слова )
9. Ch_chov - 08 Сентября, 2016 - 06:10:39 - перейти к сообщению
Строитель, для слов есть str_word_count.
10. dcc0 - 08 Сентября, 2016 - 09:53:40 - перейти к сообщению
Ch_chov точняк

Вот такой код:
PHP:
скопировать код в буфер обмена
  1. $str = "Hello friend, you're looking          good today! friend, looking:";
  2. print_r($a);


Выводит вот такой результат:

PHP:
скопировать код в буфер обмена
  1. Array ( [Hello] => 1 [friend] => 2 [you're] => 1 [looking] => 2 [good] => 1 [today] => 1 )


Строитель, не подумайте, что я с пренебрежением отнесся к вашему коду, просто больше обратил внимание на тот комментарий автора, в котором он просит идеи, а не код.
(Добавление)
Только печальный момент:
Цитата:
Эта функция считает словами последовательности алфавитных символов
11. DarkLan - 08 Сентября, 2016 - 12:10:55 - перейти к сообщению
Строитель
Спасибо за ответ. +. Пойду почитаю о регулярных выражениях...
(Добавление)
dcc0 и Ch_chov
Вам тоже спасибо! Но в строке входящую в функцию попадают как цифры, так и слова. Возможно правильно будет написать две функции для чисел и слов, но так как это не коммерческий интерес, а научный то меня ответ Строитель полностью устраивает (интерес был в самой логики построения решения).
12. Строитель - 08 Сентября, 2016 - 18:00:52 - перейти к сообщению
Ch_chov пишет:
Строитель, для слов есть str_word_count.
Благодарю )
(Добавление)
dcc0, всё ок )

 

Powered by ExBB FM 1.0 RC1