давно
Старший Модератор
312929
1973
27.05.2014, 06:51
общий
это ответ
Здравствуйте, Sandor!
Примерно так:
[code lang=php]
function getRecommendations($prefs, $person, $similarity='sim_pearson')
{
$totals = array();
$simSums = array();
foreach ($prefs as $other_key=>$other_value)
{
# don't compare me to myself
if ($other_key==$person) continue;
$sim = $similarity($prefs, $person, $other_key);
# ignore scores of zero or lower
if ($sim<=0) continue;
foreach ($other_value as $item_key=>$item_value)
# only score movies I haven't seen yet
if (!array_key_exists($item_key, $prefs[$person]) || $prefs[$person][$item_key]==0)
{
# Similarity * Score
$totals[$item_key] = $item_value*$sim + (isset($totals[$item_key])?$totals[$item_key]:0);
# Sum of similarities
$simSums[$item_key] = $sim + (isset($simSums[$item_key])?$simSums[$item_key]:0);
}
}
# Create the normalized list
foreach ($totals as $item=>$total) $rankings[$item] = $total / $simSums[$item];
# Return the sorted list
arsort($rankings, SORT_NUMERIC);
return $rankings
}[/code]
Здесь функция сравнения передаётся через переменную $similarity, поэтому и вызывается через неё как $similarity($prefs, $person, $other_key). Функция array_key_exists($key, $array) проверяет наличие индекса $key в ассоциативном массиве $array - аналогично выражению key in array в Python для словаря array. Вместо двух Python'овских методов sort и reverse используется одна функция arsort сортировки элементов массива по убыванию с сохранением индексов (параметр SORT_NUMERIC означает сравнение элементов как чисел). К сожалению, в PHP нет аналога Python'овского метода setdefault для ассоциативных массивов, поэтому вместо него используется обычная для такого случая конструкция вида isset($array[$key])?$array[$key]:0, которая возвращает элемент массива $array с индексом $key, если элемент с таким индексом существует, и значение по умолчанию (например, 0), если он не существует.