Было бы лучше, если бы вы использовали вызываемую функцию с замыканием, анонимную функцию или указали метод класса. Если вы выполняете метод больше, чем один, он попытается переопределить функцию, и эта функция уже существует. Более того, функция может быть объявлена в другом месте, и это вызовет аналогичную проблему. Вот почему лучше использовать следующие решения.
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();
}