array_udiff в symfony3 - не могу найти функцию - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь использовать array_udiff

public function findFreeUsers($weekId)
{
    function compare_users(User $user1, User $user2)
    {
        return $user1->getId() <=> $user2->getId();
    }
    $em = $this->getEntityManager();
    $week = $em->getRepository(Week::class)->findOneBy(["id" => $weekId]);
    $busyWeeks = $em->getRepository(Week::class)->findWeekBetweenDates($week);
    $busyUsers = array();
    foreach ($busyWeeks AS $busyWeek) {
        $tmp = $em->getRepository(UserWeek::class)->findBy(["week" => $busyWeek["id"]]);
        if ($tmp != null) {
            foreach($tmp AS $singleWeek) {
                $busyUsers[] = $singleWeek->getUser();
            }
        }
    }
    $allUsers = $em->getRepository(User::class)->findAll();
    $freeUsers = array_udiff($allUsers, $busyUsers, "compare_users");
    return $freeUsers;
}

Error

Предупреждение: array_udiff () ожидает, что параметр 3 будет допустимым обратным вызовом, функция 'compare_users' не найдена или недопустимое имя функции

Я объявляю compare_users () в публичной функции в репозитории. Кажется, что Symfony не может найти функцию compare_users. То же самое происходит, когда я объявляю функцию coparision после использования array_udiff или объявляю ее между публичными функциями в repo

1 Ответ

0 голосов
/ 06 ноября 2018

Было бы лучше, если бы вы использовали вызываемую функцию с замыканием, анонимную функцию или указали метод класса. Если вы выполняете метод больше, чем один, он попытается переопределить функцию, и эта функция уже существует. Более того, функция может быть объявлена ​​в другом месте, и это вызовет аналогичную проблему. Вот почему лучше использовать следующие решения.

public function findFreeUsers($weekId)
{
    $em = $this->getEntityManager();
    $week = $em->getRepository(Week::class)->findOneBy(["id" => $weekId]);
    $busyWeeks = $em->getRepository(Week::class)->findWeekBetweenDates($week);
    $busyUsers = array();
    foreach ($busyWeeks AS $busyWeek) {
        $tmp = $em->getRepository(UserWeek::class)->findBy(["week" => $busyWeek["id"]]);
        if ($tmp != null) {
            foreach($tmp AS $singleWeek) {
                $busyUsers[] = $singleWeek->getUser();
            }
        }
    }
    $allUsers = $em->getRepository(User::class)->findAll();
    $freeUsers = array_udiff($allUsers, $busyUsers, function (User $user1, User $user2) {
        return $user1->getId() <=> $user2->getId();
    });

    return $freeUsers;
}

Другие опции

с закрытием:

public function findFreeUsers($weekId)
{
        $em = $this->getEntityManager();
        $week = $em->getRepository(Week::class)->findOneBy(["id" => $weekId]);
        $busyWeeks = $em->getRepository(Week::class)->findWeekBetweenDates($week);
        $busyUsers = array();
        foreach ($busyWeeks AS $busyWeek) {
            $tmp = $em->getRepository(UserWeek::class)->findBy(["week" => $busyWeek["id"]]);
            if ($tmp != null) {
                foreach($tmp AS $singleWeek) {
                    $busyUsers[] = $singleWeek->getUser();
                }
            }
        }
        $compareClosure = function (User $user1, User $user2) {
            return $user1->getId() <=> $user2->getId();
        };
        $allUsers = $em->getRepository(User::class)->findAll();
        $freeUsers = array_udiff($allUsers, $busyUsers, $compareClosure);

        return $freeUsers;
}

С классом, вызываемым

public function findFreeUsers($weekId)
{
        $em = $this->getEntityManager();
        $week = $em->getRepository(Week::class)->findOneBy(["id" => $weekId]);
        $busyWeeks = $em->getRepository(Week::class)->findWeekBetweenDates($week);
        $busyUsers = array();
        foreach ($busyWeeks AS $busyWeek) {
            $tmp = $em->getRepository(UserWeek::class)->findBy(["week" => $busyWeek["id"]]);
            if ($tmp != null) {
                foreach($tmp AS $singleWeek) {
                    $busyUsers[] = $singleWeek->getUser();
                }
            }
        }
        $allUsers = $em->getRepository(User::class)->findAll();
        $freeUsers = array_udiff($allUsers, $busyUsers, [$this, 'compare_users']);

        return $freeUsers;
} 

public static function compare_users(User $user1, User $user2) 
{
    return $user1->getId() <=> $user2->getId();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...