fork download
  1. <?php
  2.  
  3. class Employee
  4. {
  5. public $name; // имя-фамилия
  6. public $rate; // часовая ставка (сколько он получает тугриков за час работы)
  7. public $hours = array(); // массив, содержащий отработанные часы по неделям
  8.  
  9. public function __construct($name, $rate)
  10. {
  11. // задаем имя и часовую ставку
  12. $this->name = $name;
  13. $this->rate = $rate;
  14. }
  15.  
  16. /** Считает общее число отработанных часов */
  17. public function getTotalHoursWorked()
  18. {
  19. // Просто складываем значения часов в массиве
  20. return array_sum($this->hours);
  21. }
  22.  
  23. /** Считает нормальные часы */
  24. public function getNormalHours()
  25. {
  26. $normalHours = 0;
  27. foreach ($this->hours as $hoursAWeek) {
  28. if ($hoursAWeek <= 40) {
  29. $normalHours += $hoursAWeek;
  30. }
  31. elseif ($hoursAWeek > 40) {
  32. $normalHours += $hoursAWeek - ($hoursAWeek - 40);
  33. }
  34. }
  35. return $normalHours;
  36. }
  37. public function getOvertimeHours()
  38. {
  39. return $this->getTotalHoursWorked() - $this->getNormalHours();
  40. }
  41.  
  42. /** Считает зарплату */
  43. public function getSalary()
  44. {
  45. // Получаем число отработанных часов
  46. $hours = $this->getNormalHours();
  47. // и умножаем на часовую ставку
  48. $normalSalary = $hours * $this->rate;
  49. // Получаем число отработанных часов
  50. $overtime = $this->getOvertimeHours();
  51. // и умножаем на двойную ставку
  52. $overtimeSalary = $overtime * ($this->rate * 2);
  53. return $normalSalary + $overtimeSalary;
  54. }
  55.  
  56. }
  57.  
  58. function padRight($x, $y){
  59. return $x.str_repeat(" ", $y - strlen($x));
  60. }
  61. function padLeft($x, $y){
  62. return str_repeat(" ", $y - strlen($x)) . $x;
  63. }
  64. $ivan = new Employee("ivanov ivan", 10);
  65. // name и rate заданы через конструктор, потому осталось лишь написать часы
  66. $ivan->hours = array(40, 40, 40, 40); // Иван работает по 40 часов в неделю
  67.  
  68. $peter = new Employee("petrov petr", 8);
  69. $peter->hours = array(40, 10, 40, 50); // Петр взял отгул и потому отработал меньше часов,
  70. // но в последнюю неделю решил поработать побольше
  71.  
  72. $employees = array($ivan, $peter);
  73.  
  74. $col1 = 15;
  75. $col2 = 9;
  76.  
  77. // Заголовок таблицы
  78. echo padRight('Employee', $col1) .
  79. padLeft('Hour', $col2) .
  80. padLeft('Overtime', $col2) .
  81. padLeft('Rate', $col2) .
  82. padLeft('Salary', $col2) . "\n";
  83.  
  84. // Сама таблица
  85. $totalHours = 0;
  86. $totalSalary = 0;
  87. $totalOvertime = 0;
  88. foreach ($employees as $employee) {
  89. $shortName = preg_replace('/( )([a-z])([a-z]+)/ui', ' $2.', $employee->name);
  90. echo padRight($shortName, $col1) .
  91. padLeft($employee->getTotalHoursWorked(), $col2) .
  92. padLeft($employee->getOvertimeHours(), $col2) .
  93. padLeft($employee->rate, $col2) .
  94. padLeft($employee->getSalary(), $col2) . "\n";
  95. $totalHours += $employee->getTotalHoursWorked();
  96. $totalSalary += $employee->getSalary();
  97. $totalOvertime += $employee->getOvertimeHours();
  98. }
  99. echo padRight("All", $col1) .
  100. padLeft($totalHours, $col2) .
  101. padLeft($totalOvertime, $col2) .
  102. padLeft(null, $col2) .
  103. padLeft($totalSalary, $col2) . "\n";
Success #stdin #stdout 0.01s 82944KB
stdin
Standard input is empty
stdout
Employee            Hour Overtime     Rate   Salary
ivanov i.            160        0       10     1600
petrov p.            140       10        8     1200
All                  300       10              2800