@topuserman

Как применить array_reduce?

Задан массив объектов:

class A {
   public __conctruct(private int $skill, private  int $cost) { }
   public function getSkill(): int { $return $this->skill; }
   public function getCost(): int { $return $this->cost; }
}

$arr = [
    new A(10, 20),
    new A(90, 5),
    new A(33,  45),
];

function getMaxSkill($array, int $resource) ?A; // сигнатура функции


нужна реализация getMaxSkill, через array_reduce, чтобы результатом работы функции был объект или null. В случае объекта, возвращается объект с максимальным значением skill за указанные ресурсы.

Пробовал сделать так:
function getMaxSkill($array, int $resource) ?A {
        return array_reduce(
            $array,
            function (?A $prev, A $curr) use ($resource)
            {
                if (!$prev) {
                    return $curr;
                }

                $cond = $curr->getSkill() > $prev->getSkill() && $curr->getCost() <= $resource;

                return $cond ? $curr : null;
            }
        );
    }


Но не работает..
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function getMaxSkill(array $array, int $resource): ?A
{
    return array_reduce(
        $array,
        fn($carry, $item) => 
            $item->getCost() <= $resource
                && ($carry === null || $carry->getSkill() < $item->getSkill())
                ? $item
                : $carry,
        null
    );
}

Sandbox
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы