Понадобилось сравнить каждое слово из набора с определенным текстом. Но сравнить не просто есть/нет а подсчитать количество совпадений для каждого слова.
Набросал вот это, но как видите задачу не выполняет.
<?
$slova="машина, авто, купить"; //слова для сравнения
$massiv=explode(", ", $slova); //массив
$num=count($massiv); //количество слов в массиве
$str1 = "машина, авто, купить машину, купить, авто, покупка авто!"; //строка для сравнения
for($x=0; $x<$num; $x++){
$str2=$massiv[$x];
$dlina=strlen($massiv[$x]); //длина слова
$najdeno=similar_text($str1,$str2)/$dlina;
$itog.="$str2: $najdeno<br />";
}
echo $itog;
?>
выводит:
машина: 1
авто: 1
купить: 1
Спустя 38 минут, 33 секунды (17.10.2011 - 23:33) imbalance_hero написал(а):
В разделе конкурсов есть как раз конкурс по поиску, в моей работе как раз и искались совпадения, выделялись, и отдельно статистика отображалась по совпадениям каждого слова, разделенного пробелом.
Спустя 31 минута, 8 секунд (18.10.2011 - 00:04) dadli написал(а):
такое нужно ?
$str1 = "машина, авто, купить машину, купить, авто, покупка авто!";
$str1 = preg_replace("#[^a-zA-Zа-яёА-ЯЁ\s]+#u","",$str1);
$slova="машина, авто, купить"; //слова для сравнения
$slova = preg_replace("#[^a-zA-Zа-яёА-ЯЁ\s]+#u","",$slova);
$arr1 = explode(" ",$str1);
$arr2 = explode(" ",$slova);
$newarr = array_intersect($arr1,$arr2);
$newarr = array_count_values($newarr);
foreach ($newarr as $k=>$v) {
echo "$k: $v <br>";
}
Спустя 20 минут, 18 секунд (18.10.2011 - 00:25) Winston написал(а):
Еще один вариант решения
Результат
PS: Будет работать только в PHP >= 5.3 если ниже, то нужно заменить function на create_function
Спустя 17 минут, 14 секунд Winston написал(а):
Даже так можно
Этот пример будет работать и в PHP < 5.3
Свернутый текст
$slova="машина, авто, купить";
$massiv=explode(", ", $slova);
$str = "машина, авто, купить машину, купить, авто, покупка авто!";
$data = preg_split("#[^а-яё]+#iu", $str, null, PREG_SPLIT_NO_EMPTY);
$arr = array_map(function($item) use ($data) { return in_array($item, $data) ? array_keys($data, $item) : 0;}, $massiv);
$arr2 = array_map(function($item) use ($massiv) { return sizeof($item);}, $arr);
$result = array_combine($massiv, $arr2);
echo '<pre>'.print_r($result, 1).'</pre>';
Результат
Array
(
[машина] => 1
[авто] => 3
[купить] => 2
)
PS: Будет работать только в PHP >= 5.3 если ниже, то нужно заменить function на create_function
Спустя 17 минут, 14 секунд Winston написал(а):
Даже так можно
Свернутый текст
$slova="машина, авто, купить";
$massiv=explode(", ", $slova);
$str = "машина, авто, купить машину, купить, авто, покупка авто!";
$data = preg_split("#[^а-яё]+#iu", $str, null, PREG_SPLIT_NO_EMPTY);
$arr = array_map(create_function('$item', 'global $data; return in_array($item, $data) ? sizeof(array_keys($data, $item)) : 0;'), $massiv);
$result = array_combine($massiv, $arr);
echo '<pre>'.print_r($result, 1).'</pre>';
Этот пример будет работать и в PHP < 5.3
Спустя 9 часов, 24 минуты, 36 секунд (18.10.2011 - 09:49) lightstar написал(а):
Цитата (dadli @ 17.10.2011 - 21:04) |
такое нужно ? |
Что то с preg_replace. две ошибки:
Warning: preg_replace(): Compilation failed: invalid UTF-8 string at offset 9
Спустя 3 минуты, 39 секунд (18.10.2011 - 09:53) lightstar написал(а):
Цитата (Winston @ 17.10.2011 - 21:25) |
Еще один вариант решения |
Parse error: syntax error, unexpected T_FUNCTION, expecting ')' on line 7
тут
$arr = array_map(function($item) use ($data) { return in_array($item, $data) ? array_keys($data, $item) : 0;}, $massiv);вроде все скобки закрыты

Спустя 3 минуты, 27 секунд (18.10.2011 - 09:56) Zerstoren написал(а):
Оо
В PHP, функции нельзя передать в переменную или положить в аргумент другой функции.
Читайте ман http://php.net/manual/ru/function.array-map.php
В PHP, функции нельзя передать в переменную или положить в аргумент другой функции.
Читайте ман http://php.net/manual/ru/function.array-map.php
Спустя 2 минуты, 42 секунды (18.10.2011 - 09:59) lightstar написал(а):
Цитата (Winston @ 17.10.2011 - 21:25) |
Еще один вариант решения |
Warning: preg_split(): Compilation failed: invalid UTF-8 string at offset 3 on line 7
$data = preg_split("#[^а-яё]+#iu", $str, null, PREG_SPLIT_NO_EMPTY);
Плюс трижды
Warning: in_array() [function.in-array]: Wrong datatype for second argument in Z:\home\test1.ru\www\11.php(9) : runtime-created function on line 1
первая строка
<?php

Спустя 1 час, 50 минут, 6 секунд (18.10.2011 - 11:49) Winston написал(а):
Zerstoren
Цитата (Zerstoren @ 18.10.2011 - 09:56) |
В PHP, функции нельзя передать в переменную или положить в аргумент другой функции. |
Читаем о замыканиях и анонимных (лямбда) ф-ях в PHP :)
Цитата (lightstar @ 18.10.2011 - 09:59) |
Warning: preg_split(): Compilation failed: invalid UTF-8 string at offset 3 on line 7 |
Если у тебя не utf-8, то перепиши
$data = preg_split("#[^а-яё]+#i", $str, null, PREG_SPLIT_NO_EMPTY);
Спустя 10 минут, 51 секунда (18.10.2011 - 12:00) dadli написал(а):
lightstar
да как кажется вам не utf-8, удалите после знака диеза # символ u
удалите в обе регулярке
да как кажется вам не utf-8, удалите после знака диеза # символ u
удалите в обе регулярке
Спустя 21 час, 39 минут, 9 секунд (19.10.2011 - 09:39) lightstar написал(а):
Цитата (Winston @ 18.10.2011 - 08:49) |
Winston |
Все работает, спасибо