比较数组中的人



我试图解决的问题是这个。

我有一群人,有些人在这个数组中重复,但他们的细节并不总是完全相同,他们的名字略有不同。所以我要做的是遍历所有的名字,比较名字有多接近,然后如果这是匹配的,比较他们的年龄和家乡。

稍后我希望创建一个新数组并说"此人也出现了以下 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

然后做你的比较检查。确保使用迭代器 - 如果您正在迭代数万人,这将阻止您的内存管理。

这样,对于每个用户,您可能只与少数可能的匹配项(而不是潜在的数千个)进行比较。

相关内容

  • 没有找到相关文章

最新更新