symfony3中的array_udiff-无法找到函数

时间:2018-11-06 11:58:28

标签: php arrays symfony compare

我正在尝试使用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;
}

错误

  

警告:array_udiff()期望参数3是有效的回调,找不到函数'compare_users'或无效的函数名称

我在存储库的公共函数中声明了compare_users()。 似乎symfony无法找到compare_users函数。当我在使用array_udiff之后声明协比函数或在repo的公共函数之间声明它时,发生了同样的事情

1 个答案:

答案 0 :(得分:1)

如果将可调用函数与闭包,匿名函数或指向类的方法一起使用,会更好。如果您多次执行该方法,它将尝试重新声明该函数,并且该函数已经存在。而且,该函数可以在其他地方声明,并且会引起类似的问题。这就是为什么最好使用以下解决方案。

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();
}