Переписать функцию с js reduce на php

165
13 августа 2018, 03:40

Переношу тяжёлый клиентский код на сервер и у меня возникли проблемы. Есть функция, написанная в JavaScript:

return Object.keys(locationData).reduce((prev, curr) => {
    var prevDistance = locationDistance(targetLocation, locationData[prev]),
        currDistance = locationDistance(targetLocation, locationData[curr]);
    return (prevDistance < currDistance) ? prev : curr;
});

Написал код на PHP:

function nearestsReduce($prev, $curr) {
    global $targetLocGlobal, $locationDataGlobal;
    $prevDistance = locationDistance($targetLocGlobal, $locationDataGlobal[$prev]);
    $currDistance = locationDistance($targetLocGlobal, $locationDataGlobal[$curr]);
    if($prevDistance < $currDistance) {
        return $prev;
    }
    return $curr;
}
function closestLocation($targetLocation, $locationData) {
    $all_keys = array_keys($locationData);
    return array_reduce($all_keys, 'nearestsReduce');
}

Собрал все ключи, отправил в функцию, а в самой функции уже выполняю всё то же, что и в JavaScript, но почему-то получаю ошибку:

Notice: Undefined index: in

При чём, ошибка так и выводится - с пустым индексом. И я не могу понять, какой именно индекс не объявлен. Ошибка указывает на эту строку:

$prevDistance = locationDistance($targetLocGlobal, $locationDataGlobal[$prev]);
Answer 1

В документации написано о первом параметре функции обратного вызова (ваша nearestsReduce) для array_reduce:

Содержит результирующее значение с предыдущей итерации; в случае же первой итерации содержит значение параметра initial.

initial - третий параметр array_reduce, он у вас не задан, и по умолчанию null. При первом же вызове вашей функции обратного вызова $prev получает значение null. Такой индекс в массиве locationDataGlobal не существует.

READ ALSO
Yii2 сохранение сессии

Yii2 сохранение сессии

Всем привет!

153
Как создать API на Laravel

Как создать API на Laravel

Как создать API на сайте, написанном на laravel 56? В документации на русском только описана API-аутентификация

183
Вывод 4-х значных комбинаций

Вывод 4-х значных комбинаций

Пытаюсь реализовать вывод 4-х значных значений имея набор символов : $a = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

165