2016-04-20 63 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