[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Количество совпадений при сравнении массивов
lightstar
Доброго времени суток.
Понадобилось сравнить каждое слово из набора с определенным текстом. Но сравнить не просто есть/нет а подсчитать количество совпадений для каждого слова.

Набросал вот это, но как видите задачу не выполняет.
<?
$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 написал(а):
Еще один вариант решения
Свернутый текст
$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);
вроде все скобки закрыты user posted image

Спустя 3 минуты, 27 секунд (18.10.2011 - 09:56) Zerstoren написал(а):
Оо

В 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
user posted image

Спустя 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
удалите в обе регулярке

Спустя 21 час, 39 минут, 9 секунд (19.10.2011 - 09:39) lightstar написал(а):
Цитата (Winston @ 18.10.2011 - 08:49)
Winston

Все работает, спасибо
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.