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