我正在尝试在我的数据库中逐个将一行与另一个字符进行比较,并给出最适合给定数据的 id。例如,我的数据库上有具有 AAA 序列的用户 David,我想将其与我给出的 ABA 序列进行比较,因此我希望收到匹配的百分比(在本例中为 66.6%(,我已经做到了,但不知道如何继续:
$uname = $_POST['sequence'];
$query = "SELECT name FROM dna WHERE sequence = '$uname'";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo $row['name'];
}
为了获得百分比的相似性,您可以使用 PHP 函数 similar_text()
。如果将第三个参数传递给函数,则比较两个字符串并返回相似性百分比。
$string_1 = 'AAA';
$string_2 = 'ABA';
similar_text($string_1, $string_2, $percent);
echo $percent;
// 66.666666666667
数据库部分的工作要多一些。一个非常基本的实现可能如下所示。
请记住,真正的问题是,您将一个字符串与 100 万行进行比较。一般来说:人们不会这样做,因为不是字符,而是有点。为了比较位,您将使用简单的位移。无论如何。。。在这里,在使用字符/字符串时,滚动行请求或有限查询也会有所帮助。这意味着,您要求数据库提供 500 行的块并执行计算工作。这取决于数据集的行数和内存使用情况。
// incomming via user input
$string_1 = $_POST['sequence'];
// temporary var to store the highest similarity percentage and it's row_id
$bestValue = array('row_id' => 0, 'similarity' => '0');
// iterate over the "total number of rows" in the database
foreach($rows as $id => $row)
{
// get a new string_2 from db
$string_2 = $row['name'];
// calculate similarity
similar_text($string_1, $string_2, $percent);
// if calculated similarity is higher, then update the "best" value
if($percent > $bestValue['similarity']) {
$bestValue = array('row_id' = $id, 'similiarity' = $percent);
}
}
var_dump($bestValue);
处理完所有数据库行后,bestValue 将包含最高百分比及其行 ID。
您可以在这里做各种各样的事情,例如:
- 从第一场比赛更新 (<( 切换到上一场比赛更新 (<=(
- 在第一个匹配项时停止迭代
- 商店row_id,具有相同的相似性(多行匹配(
- 如果不需要多行匹配,则可以删除数组并使用两个 var 作为行和百分比
- 正确的错误处理,转义,Mysqli用法
请注意:这不是最有效的方法,尤其是在处理大型数据集时。如果你在一个级别上需要这个,这不是爱好或家庭作业,那么只需拉一个工具,它针对这项工作进行了优化,比如 EMBOSS (http://emboss.sourceforge.net/(。