2016-04-20 3 views
0

Проблема, которую я пытаюсь решить, так это.Сравнение людей в массиве

У меня есть массив людей, некоторые из людей повторяются в этом массиве, но их детали не всегда одинаковы, есть небольшие вариации в их имени. Итак, что я пытаюсь сделать, это перебрать все имена и сравнить, насколько близко это имя, тогда, если это совпадение, сравните их возраст и родной город.

Позже я надеюсь создать новый массив и сказать: «этот человек также появляется со следующими идентификаторами» ...

То, что я до сих пор является своего рода пузырь, который, если я позволить ей работать долго достаточно, я уверен, что смогу выполнить свою работу. Я просто смотрю, есть ли у кого-то лучшее решение?

<?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