fork(3) download
  1. <?php
  2.  
  3.  
  4. class Employee // employee значит «сотрудник»
  5. {
  6. public $name; // имя-фамилия
  7. public $rate; // часовая ставка (сколько он получает тугриков за час работы)
  8. public $hours = array(); // массив, содержащий отработанные часы по неделям
  9. public $overtimeHours = 0; // переменная, которая будет содержать данные о переработанных часах
  10. /* Считает общее число отработанных часов */
  11. public function getTotalHoursWorked()
  12. {
  13. // Просто складываем значения часов в массиве
  14. return array_sum($this->hours);
  15. }
  16.  
  17. /* Считает зарплату */
  18. public function getSalary()
  19. {
  20. // Получаем число отработанных часов
  21. $hours = $this->getTotalHoursWorked();
  22. // и умножаем на часовую ставку
  23. $salary = $hours * $this->rate;
  24. return $salary;
  25. }
  26.  
  27. /* "Волшебный" метод */
  28. public function __construct($name, $rate)
  29. {
  30. // задаем имя и часовую ставку
  31. $this->name = $name;
  32. $this->rate = $rate;
  33. }
  34. public function getNormalHours() {
  35. $normalHours = 0;
  36. foreach ($this->hours as $hoursAWeek) {
  37. if ($hoursAWeek <= 40) {
  38. $normalHours += $hoursAWeek;
  39. } if ($hoursAWeek > 40) {
  40. $normalHours += $hoursAWeek - ($hoursAWeek - 40);
  41. }
  42. }
  43. return $normalHours;
  44. }
  45.  
  46. public function getOvertimeHours() {
  47. $overtime = 0;
  48. foreach ($this->hours as $hoursAWeek) {
  49. if ($hoursAWeek > 40) {
  50. $overtime += ($hoursAWeek - 40);
  51. }
  52. }
  53. return $overtime;
  54. }
  55.  
  56. }
  57.  
  58. function getNormalSalary($normalHours, $rate)
  59. {
  60. // Получаем число нормально отработанных часов
  61. $salary = $normalHours * $rate;
  62. return $salary;
  63. }
  64.  
  65. function getOvertimeSalary($normalHours, $rate)
  66. {
  67. // Получаем число переработанных часов и умножаем на удвоенную часовую ставку
  68. $salary = $normalHours * ($rate * 2);
  69. return $salary;
  70. }
  71.  
  72. function padRight($x, $y){
  73. $j = preg_split('//u', $x);
  74. $o = mb_strlen($x);
  75. $p = array_fill(0, $y - $o, " ");
  76. $a = array_merge($j, $p);
  77. $tableCell = implode("", $a);
  78. return $tableCell;
  79. }
  80. function padLeft($x, $y){
  81. $j = preg_split('//u', $x);
  82. $o = mb_strlen($x);
  83. $p = array_fill(0, $y - $o, " ");
  84. $a = array_merge($p, $j);
  85. $tableCell = implode("", $a);
  86. return $tableCell;
  87. }
  88.  
  89. // Ширина колонок
  90. $col1 = 15;
  91. $col2 = $col4 = $col5 = 8;
  92. $col3 = 10;
  93.  
  94. $ivan = new Employee("Иванов Иван", 10);
  95. $ivan->hours = array(40, 40, 40, 40);
  96. $allHours[] = $ivan->hours;
  97.  
  98. $peter = new Employee("Петров Петр", 8);
  99. $peter->hours = array(40, 10, 40, 50); // но в последнюю неделю решил поработать побольше
  100. $allHours[] = $peter->hours;
  101.  
  102. $sidor = new Employee("Сидоров Сидор", 10);
  103. $sidor->hours = array(40, 60, 40, 40);
  104. $allHours[] = $sidor->hours;
  105.  
  106. $employees = array($ivan, $peter, $sidor);
  107.  
  108. // Цикл для удаления части имени работника
  109. foreach ($employees as $employee) {
  110. $employee->name = preg_replace('/( )([А-ЯЁ])([а-яё]+)/u', ' $2.', $employee->name);
  111. }
  112.  
  113. $hours = 0;
  114. $salary = 0;
  115. $overtime = 0;
  116. for ($i = 0; $i < count($allHours); $i++) {
  117. $hours += array_sum($allHours[$i]);
  118. if ($employees[$i]->getNormalHours() > 0) {
  119. $normalHours = $employees[$i]->getNormalHours();
  120. $rate = $employees[$i]->rate;
  121. }
  122. if ($employees[$i]->getOvertimeHours() > 0) {
  123. $normalHours = $employees[$i]->getOvertimeHours();
  124. $rate = $employees[$i]->rate;
  125. $overtimeSalary = getOvertimeSalary($normalHours, $rate);
  126. $employees[$i]->overtimeHours = $overtimeSalary;
  127. }
  128. }
  129.  
  130. // Осталось посчитать $normalHours умноженные на нормальную ставку и $overtimeHours умноженные на ставку за переработку
  131.  
  132. // Заголовок таблицы
  133. echo padRight("Сотрудник", $col1) .
  134. padLeft("Часы", $col2) .
  135. padLeft("Овертайм", $col3) .
  136. padLeft("Ставка", $col4) .
  137. padLeft("З/п", $col5) . "\n";
  138.  
  139. // Сама таблица
  140. foreach ($employees as $employee) {
  141. echo padRight($employee->name, $col1) .
  142. padLeft($employee->getTotalHoursWorked(), $col2) .
  143. padLeft($employee->getOvertimeHours(), $col3) .
  144. padLeft($employee->rate, $col4) .
  145. padLeft(getNormalSalary($employee->getNormalHours(), $employee->rate) + $employee->overtimeHours, $col5) . "\n";
  146. if ($employee->getOvertimeHours() > 0) {
  147. $overtime += $employee->getOvertimeHours();
  148. }
  149. $salary += getNormalSalary($employee->getNormalHours(), $employee->rate) + $employee->overtimeHours;
  150. }
  151.  
  152. echo padRight("Всего:", $col1) .
  153. padLeft($hours, $col2) .
  154. padLeft($overtime, $col3) .
  155. padLeft(null, $col4) .
  156. padLeft($salary, $col5) . "\n";
Success #stdin #stdout 0.02s 52472KB
stdin
Standard input is empty
stdout
Сотрудник          Часы  Овертайм  Ставка     З/п
Иванов И.           160         0      10    1600
Петров П.           140        10       8    1200
Сидоров С.          180        20      10    2000
Всего:              480        30            4800