Кажется, я застрял. У меня есть функция, которая рассчитывает зарплату. Я пытаюсь сделать так, чтобы я мог указать одного или нескольких пользователей при вызове функции. Но я столкнулся с 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;
}
Я думаю, что если при вызове функции и есть только 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;
}
Вот мое решение для вашей функции класса. Похоже, вы пытались вернуть один объект и каждый раз перезаписывать сотрудника. Если вы можете принять массив идентификаторов, имеет смысл вернуть массив зарплат. Имеет ли это смысл?
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
не сломает все, по крайней мере, не показывая ошибку.