давно
Старший Модератор
312929
1973
24.05.2014, 17:24
общий
это ответ
Здравствуйте, Sandor!
Если переводить дословно, оператор за оператором, то будет примерно так:
[code lang=php]
# Возвращает оценку подобия person1 и person2 на основе расстояния
function sim_distance($prefs, $person1, $person2)
{
# Получить список предметов, оцененных обоими
$si = array();
foreach ($prefs[$person1] as $key=>$value) if (array_key_exists($key, $prefs[$person2])) $si[$key] = 1;
# Если нет ни одной общей оценки, вернуть 0
if (count($si)==0) return 0;
# Сложить квадраты разностей
$sum_of_squares = 0;
foreach ($prefs[$person1] as $key=>$value) if (array_key_exists($key, $prefs[$person2])) $sum_of_squares += pow($prefs[$person1][$key]-$prefs[$person2][$key],2);
return 1/(1+sqrt($sum_of_squares));
}[/code]
Но можно воспользоваться некоторыми функциями PHP для работы с массивами, тогда код получится короче:
[code lang=php]
# Возвращает оценку подобия person1 и person2 на основе расстояния
function sim_distance($prefs, $person1, $person2)
{
# Получить список индексов предметов, оцененных обоими
$keys = array_intersect(array_keys($prefs[$person1]), array_keys($prefs[$person2]));
# Если нет ни одной общей оценки, вернуть 0
if (count($keys)==0) return 0;
# Сложить квадраты разностей
$sum_of_squares = 0;
foreach ($keys as $key) $sum_of_squares += pow($prefs[$person1][$key]-$prefs[$person2][$key],2);
return 1/(1+sqrt($sum_of_squares));
}[/code]
Здесь foreach ($array as $value) - аналог Python'овского for (value in array) для списка array, foreach ($array as $key=>$value) для ассоциативного массива $array - аналог for (key,value in array.items()) для словаря array, функция array_keys($array) возвращает массив индексов массива $array (как метод array.keys() - список индексов словаря array), функция array_intersect возвращает пересечение массивов, функции count и pow соответствуют Python'овским len и pow.
5
Благодарю за подробный ответ!