Есть ли способ вернуть один или несколько предметов без повторения?

Кажется, я застрял. У меня есть функция, которая рассчитывает зарплату. Я пытаюсь сделать так, чтобы я мог указать одного или нескольких пользователей при вызове функции. Но я столкнулся с 2 проблемами. Одним из них является то, как я могу построить выходной результат, если я укажу несколько идентификаторов пользователя. И вторая проблема — как не повторить мой код дважды (для одного и многих пользователей). Он отлично работает, если мне нужно получить его только для одного пользователя.

Я хотел бы иметь возможность назвать это так:

// Get salary for user id: 10
$salary = Salary::getSalary([10], '2018-12-01', '2018-12-31');

echo $salary->user->fullname;
echo $salary->salary->total;
echo $salary->checked;

// Get salary for users - 10, 20, 30
$salaries = Salary::getSalary([10, 20, 30, '2018-12-01', '2018-12-31');

foreach ($salaries as $salary) {
echo $salary->user->fullname;
echo $salary->salary->total;
echo $salary->checked;
}

Вот моя функция

public function getSalary($user_id, $date_from, $date_to)
{
$salary = new stdClass;

if ( count($user_id) == 1 ) {
$salary->user = new stdClass;
$salary->user->fullname = self::getUserById($user_id)->fullname;
$salary->user->phone    = self::getPhone($user_id);
$salary->user->email    = self::getUserById($user_id)->e_mail;

$salary->salary      = self::getSalary($user_id, $date_from, $date_to);
$salary->checked     = self::isChecked($user_id, $date_from, $date_to);
} else if ( count($user_id) > 1 ) {
foreach ($user_id as $employee)
{
$salary->employee = new stdClass;
$salary->employee->fullname = self::getUserById($user_id)->fullname;
$salary->employee->phone    = self::getPhone($user_id);
$salary->employee->email    = self::getUserById($user_id)->e_mail;
$salary->employee->siawork  = self::getUserById($user_id)->siawork;

$salary->salary      = self::getSalary($user_id, $date_from, $date_to);
$salary->checked     = self::isChecked($user_id, $date_from, $date_to);
}
}

return $salary;
}

0

Решение

Я думаю, что если при вызове функции и есть только 1 запись, вы можете преобразовать это в массив, чтобы всегда использовать один и тот же код для обработки данных, и создать массив данных о зарплате для отправки обратно …

public function getSalary($user_id, $date_from, $date_to)
{
$salaries = [];

if ( !is_array($user_id) ) {
$user_id = [$user_id];
}
foreach ($user_id as $employee)
{
$salary->employee = new stdClass;
$salary->employee->fullname = self::getUserById($user_id)->fullname;
$salary->employee->phone    = self::getPhone($user_id);
$salary->employee->email    = self::getUserById($user_id)->e_mail;
$salary->employee->siawork  = self::getUserById($user_id)->siawork;

$salary->salary      = self::getSalary($user_id, $date_from, $date_to);
$salary->checked     = self::isChecked($user_id, $date_from, $date_to);

$salaries[] = $salary;
}

return $salaries;
}

Вы можете, если хотите, вернуть одну запись, если хотите, внеся изменения в последнюю часть кода …

    if ( count($user_id) == 1 ) {
$salaries = $salaries[0];
}
return $salaries;
}
1

Другие решения

Вот мое решение для вашей функции класса. Похоже, вы пытались вернуть один объект и каждый раз перезаписывать сотрудника. Если вы можете принять массив идентификаторов, имеет смысл вернуть массив зарплат. Имеет ли это смысл?

public function getSalary($user_id, $date_from, $date_to)
{
//Return an array of salary objects to match your array of id inputs
$salary = [];

if ( ! is_array($user_id) ) {
//In case a non-array is entered
$user_id = [$user_id];
}

// A foreach will work even if there's only one user ID given,
// as long as it's an array (which it should be by this point)
foreach ($user_id as $id)
{
//Get your salary object by id
$this_user = new stdClass;
$this_user->user = new stdClass;
$this_user->user->fullname = self::getUserById($id)->fullname;
$this_user->user->phone    = self::getPhone($id);
$this_user->user->email    = self::getUserById($id)->e_mail;

$this_user->salary      = self::getSalary($id, $date_from, $date_to);
$this_user->checked     = self::isChecked($id, $date_from, $date_to);

//Put it in the output array
$salary[] = $this_user;
}

return $salary;
}

Обратите внимание, пожалуйста, подтвердите все эти входные данные! Убедитесь, что положить что-то неожиданное $user_id или же $date_from или же $date_to не сломает все, по крайней мере, не показывая ошибку.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector