我试图解决的问题是这个。
我有一群人,有些人在这个数组中重复,但他们的细节并不总是完全相同,他们的名字略有不同。所以我要做的是遍历所有的名字,比较名字有多接近,然后如果这是匹配的,比较他们的年龄和家乡。
稍后我希望创建一个新数组并说"此人也出现了以下 id"......
到目前为止,我所拥有的是一种泡沫排序,如果我让它运行足够长的时间,我相信我可以完成工作。我只是想看看是否有人有更好的解决方案?
<?php
$arr = [
[
'id' => '123',
'name' => 'gary strange',
'home' => 'london',
'age' => 23
],
[
'id' => '124',
'name' => 'john jones',
'home' => 'london',
'age' => 45
],
[
'id' => '125',
'name' => 'bob smith',
'home' => 'paris',
'age' => 63
],
[
'id' => '126',
'name' => 'g strange',
'home' => 'london',
'age' => 23
],
[
'id' => '127',
'name' => 'gary strange',
'home' => 'paris',
'age' => 23
],
[
'id' => '128',
'name' => 'g f. strange',
'home' => 'london',
'age' => 23
]
];
for($i = 0; $i < count($arr); $i++) {
echo "Getting details for " . $arr[$i]['name'] . "n";
for($j = 0; $j < count($arr); $j++) {
if($j == $i) continue;
else{
echo "Comparing to " . $arr[$j]['name'];
$str1 = $arr[$i]['name'];
$str2 = $arr[$j]['name'];
similar_text($str1,$str2,$percent);
echo " - " . $percent . "%n";
}
}
echo "******n";
}
只与年龄和家乡相似的人进行比较,然后对姓名进行比较检查可能会更有效。首先与所有人进行比较似乎会非常缓慢。
对于您的 SQL,当您遍历每个用户时,如下所示:
SELECT name, age, hometown
FROM users
WHERE age BETWEEN value1 AND value2
AND hometown LIKE value3
然后做你的比较检查。确保使用迭代器 - 如果您正在迭代数万人,这将阻止您的内存管理。
这样,对于每个用户,您可能只与少数可能的匹配项(而不是潜在的数千个)进行比较。