2016-04-20 154 views
0

我试图解决的问题是这样的。比较数组中的人

我有一群人,一些人在这个数组中重复,但他们的细节并不总是完全一样,他们的名字有轻微的变化。所以我想要做的是循环所有的名字,比较名字的接近程度,然后比较他们的年龄和家乡。

后来,我希望创造一个新的数组,并说“这人还与以下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"; 

} 
+0

是仅限于PHP的解决方案,或者您可以使用任何系统来获得解决方案。这是一个来自代码的静态数组,还是从数据库中提取的这个数组。 – azngunit81

回答

1

比较只与具有相似年龄和家乡的人进行比较可能效率更高,然后对名称进行比较检查。首先与大家比较,似乎会非常慢。

像这样的东西为你的SQL,因为你通过每个用户迭代:

SELECT name, age, hometown 
FROM users 
WHERE age BETWEEN value1 AND value2 
    AND hometown LIKE value3 

,然后做你的比较检查。确保你使用迭代器 - 如果你迭代了成千上万的人,这会让你的内存管理陷入困境。

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

+0

你的解决方案是从数据库的角度来看的,但是如果他想用PHP解决它,它并不能解决他的问题 – azngunit81