如果您可以使用简单的文本而不是数组进行比较,并且如果我理解您的目标在哪里,您可以使用levenshtein php 函数(通常用于提供类似 google 的“您的意思是……吗?”函数在 php 搜索引擎中)。
它的工作方式与您使用的相反:返回两个字符串之间的差异。
例子:
<?php
function check($a, $b) {
return levenshtein($a, $b);
}
$a = 'this is just a test';
$b = 'this is not test';
$c = 'this is just a test';
echo check($a, $b) . '<br />';
//return 5
echo check($a, $c) . '<br />';
//return 0, the strings are identical
?>
但我不知道这是否会提高执行速度。但也许是的,你取出了许多 foreach 循环和 array_merge 函数。
编辑:
一个简单的速度测试(是一个 30 秒编写的脚本,它不是 100% 准确的,嗯):
function check($terms_in_article1, $terms_in_article2) {
$length1 = count($terms_in_article1); // number of words
$length2 = count($terms_in_article2); // number of words
$all_terms = array_merge($terms_in_article1, $terms_in_article2);
$all_terms = array_unique($all_terms);
foreach ($all_terms as $all_termsa) {
$term_vector1[$all_termsa] = 0;
$term_vector2[$all_termsa] = 0;
}
foreach ($terms_in_article1 as $terms_in_article1a) {
$term_vector1[$terms_in_article1a]++;
}
foreach ($terms_in_article2 as $terms_in_article2a) {
$term_vector2[$terms_in_article2a]++;
}
$score = 0;
foreach ($all_terms as $all_termsa) {
$score += $term_vector1[$all_termsa]*$term_vector2[$all_termsa];
}
$score = $score/($length1*$length2);
$score *= 500; // for better readability
return $score;
}
$a = array('this', 'is', 'just', 'a', 'test');
$b = array('this', 'is', 'not', 'test');
$timenow = microtime();
list($m_i, $t_i) = explode(' ', $timenow);
for($i = 0; $i != 10000; $i++){
check($a, $b);
}
$last = microtime();
list($m_f, $t_f) = explode(' ', $last);
$fine = $m_f+$t_f;
$inizio = $m_i+$t_i;
$quindi = $fine - $inizio;
$quindi = substr($quindi, 0, 7);
echo 'end in ' . $quindi . ' seconds';
打印:在0.36765秒后结束
第二次测试:
<?php
function check($a, $b) {
return levenshtein($a, $b);
}
$a = 'this is just a test';
$b = 'this is not test';
$timenow = microtime();
list($m_i, $t_i) = explode(' ', $timenow);
for($i = 0; $i != 10000; $i++){
check($a, $b);
}
$last = microtime();
list($m_f, $t_f) = explode(' ', $last);
$fine = $m_f+$t_f;
$inizio = $m_i+$t_i;
$quindi = $fine - $inizio;
$quindi = substr($quindi, 0, 7);
echo 'end in ' . $quindi . ' seconds';
?>
打印:在0.05023秒后结束
所以,是的,看起来更快。尝试使用许多数组项会很好(以及许多单词用于 levenshtein)
2°编辑:
使用类似的文本,速度似乎等于 levenshtein 方法:
<?php
function check($a, $b) {
return similar_text($a, $b);
}
$a = 'this is just a test ';
$b = 'this is not test';
$timenow = microtime();
list($m_i, $t_i) = explode(' ', $timenow);
for($i = 0; $i != 10000; $i++){
check($a, $b);
}
$last = microtime();
list($m_f, $t_f) = explode(' ', $last);
$fine = $m_f+$t_f;
$inizio = $m_i+$t_i;
$quindi = $fine - $inizio;
$quindi = substr($quindi, 0, 7);
echo 'end in ' . $quindi . ' seconds';
?>
打印:在0.05988秒后结束
但它可能需要超过 255 个字符:
另请注意,该算法的复杂度为 O(N**3),其中 N 是最长字符串的长度。
并且,它甚至可以返回百分比的相似值:
function check($a, $b) {
similar_text($a, $b, $p);
return $p;
}
又一个编辑
那么创建一个数据库函数,直接在 sql 查询中进行比较,而不是检索所有数据并循环它们呢?
如果你在运行 Mysql,看看这个(手工制作的 levenshtein 函数,仍然是 255 字符限制)否则,如果你在 Postgresql 上,这个另一个(应该评估的许多函数)