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. $overtime = 0;
  40. foreach ($this->hours as $hoursAWeek) {
  41. if ($hoursAWeek > 40) {
  42. $overtime += ($hoursAWeek - 40);
  43. }
  44. }
  45. return $overtime;
  46. }
  47.  
  48.  
  49. /** Считает зарплату */
  50. public function getSalary()
  51. {
  52. // Получаем число отработанных часов
  53. $hours = $this->getNormalHours();
  54. // и умножаем на часовую ставку
  55. $normalSalary = $hours * $this->rate;
  56. // Получаем число отработанных часов
  57. $overtime = $this->getOvertimeHours();
  58. // и умножаем на двойную ставку
  59. $overtimeSalary = $overtime * ($this->rate * 2);
  60. return $normalSalary + $overtimeSalary;
  61. }
  62.  
  63. }
  64.  
  65. function padRight($x, $y){
  66. return $x.str_repeat(" ", $y - strlen($x));
  67. }
  68. function padLeft($x, $y){
  69. return str_repeat(" ", $y - strlen($x)) . $x;
  70. }
  71. $ivan = new Employee("ivanov ivan", 10);
  72. // name и rate заданы через конструктор, потому осталось лишь написать часы
  73. $ivan->hours = array(40, 40, 40, 40); // Иван работает по 40 часов в неделю
  74.  
  75. $peter = new Employee("petrov petr", 8);
  76. $peter->hours = array(40, 10, 40, 50); // Петр взял отгул и потому отработал меньше часов,
  77. // но в последнюю неделю решил поработать побольше
  78.  
  79. $employees = array($ivan, $peter);
  80.  
  81. $col1 = 15;
  82. $col2 = 9;
  83.  
  84. // Заголовок таблицы
  85. echo padRight('Employee', $col1) .
  86. padLeft('Hour', $col2) .
  87. padLeft('Overtime', $col2) .
  88. padLeft('Rate', $col2) .
  89. padLeft('Salary', $col2) . "\n";
  90.  
  91. // Сама таблица
  92. $totalHours = 0;
  93. $totalSalary = 0;
  94. $totalOvertime = 0;
  95. foreach ($employees as $employee) {
  96. $shortName = preg_replace('/( )([a-z])([a-z]+)/ui', ' $2.', $employee->name);
  97. echo padRight($shortName, $col1) .
  98. padLeft($employee->getTotalHoursWorked(), $col2) .
  99. padLeft($employee->getOvertimeHours(), $col2) .
  100. padLeft($employee->rate, $col2) .
  101. padLeft($employee->getSalary(), $col2) . "\n";
  102. $totalHours += $employee->getTotalHoursWorked();
  103. $totalSalary += $employee->getSalary();
  104. $totalOvertime += $employee->getOvertimeHours();
  105. }
  106. echo padRight("All", $col1) .
  107. padLeft($totalHours, $col2) .
  108. padLeft($totalOvertime, $col2) .
  109. padLeft(null, $col2) .
  110. padLeft($totalSalary, $col2) . "\n";
Success #stdin #stdout 0s 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