Как сравнить две строковые переменные?

Статус
В этой теме нельзя размещать новые ответы.
хочу добавить, если есть необходимость выбрать повторяющиеся значения ( или проверить клоны товаров в базе по описанию) то для этого не нужно писать много кода, проще делать все на уровне базы. Кучу кода сократит такой простой запрос:

Код:
select * from products where product name like '%описание товара%'

знак % тут выступает в роли виндовой маски * при поиске. Можно пойти еще дальше и использовать регулярные выражения в запросе.
 
zavulon
да возможно тоже подходит function compareStrings
она сверяет целые слова без учеты регистра так я понимаю
вывел правда 50% совпадений

теперь бы всё это ещё засунуть в цикл
так чтоб находились максимальные проценты :thenks:
 
FaLL3N
молодец, я бы до этого не догадался ;).
прочитай ещё раз задачу топикстартера.

Добавлено через 54 секунды
вот мегакод. "Спасибо" не забудь поставить

PHP:
<?

class StringComparer {
	public $commonWords = array(' ', ',', '.', 'mb', 'kb'); // add more
	public $treshold = 0.5; // don't show anything with similarity less than 50%

	/**
	 * Convert to words array excluding common words
	 *
	 * @param string $word
	 * @return array
	 */
	protected function excludeCommonWords($word) {
		static $cache = array();
		if (isset($cache[$word])) return $cache[$word];

		$word = trim(strtolower($word));
		return $cache[$word] = array_diff(array_unique(explode(' ', $word)), $this->commonWords); // exclude common words
	}

	/**
	 * Compare words of two strings
	 *
	 * @param string $s1
	 * @param string $s2
	 * @return float 0.8 means 80% of same words
	 */
	protected function compareStringsOne($s1, $s2) {
	    $a1 = $this->excludeCommonWords($s1);
	    $a2 = $this->excludeCommonWords($s2);
	    $wordCount = (count($a1)+count($a2))/2;

	    $intersect = array_intersect($a1, $a2); // found same words

	    return count($intersect) / $wordCount;
	}

	/**
	 * Compare words of string and string/array
	 *
	 * @param string $s1
	 * @param string/array $s2
	 * @return array
	 * 		Result is like
	 * 			string2 => 0.9
	 * 			string string => 0.5
	 */
	public function compareStrings($s1, $s2) {
		if (!is_array($s2)) return $this->compareStringsOne($s1, $s2);

		$result = array();
		foreach ($s2 as $s) {
			$probability = $this->compareStringsOne($s1, $s);
			if ($probability>=$this->treshold) {
				$result[$s] = $probability;
			}
		}
		arsort($result);

		return $result;
	}

}

$comparer = new StringComparer();

// one string
$s1 = 'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM';
$s2 = 'PCI-E DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce 8500GT';
echo('<p>Вероятность: '.  ($comparer->compareStrings($s1,$s2)*100) .'%');

$s1 = 'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM';
$a = array(
	'PCI-E DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce 8500GT',
	'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM',
	'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out',
	'DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce',
);
echo('<p>Вероятности: <pre>');
print_r($comparer->compareStrings($s1,$a));
echo('</pre>');

?>


Добавлено через 2 минуты
Выводит:

Вероятность: 50%

Вероятности:
Array
(
[Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM] => 1
[Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out] => 0.95652173913043
[PCI-E DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce 8500GT] => 0.5
)

Добавлено через 4 минуты
Чтобы нормально пользоваться, надо правильно настроить $commonWords (например, добавить "Плата") и $treshold (тут уже по вкусу :) )
 
код ошибку выдает в 4 строке
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in
 
ясно я так и подумала
 
Сравнить на сколько одна строка похожа на другую в процентном соотношении. Задать, к примеру, если сходство более 70% то тогда строки идентичные.
 
Сравнить на сколько одна строка похожа на другую в процентном соотношении. Задать, к примеру, если сходство более 70% то тогда строки идентичные.

Ага, это в классе - $treshold

PHP:
$comparer = new StringComparer();
$comparer->treshold = 0.7;
...
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху