fork download
  1. <?php
  2.  
  3.  
  4. class Employee
  5. {
  6. public $name; // имя-фамилия
  7. public $rate; // часовая ставка (сколько он получает тугриков за час работы)
  8. public $hours = array(); // массив, содержащий отработанные часы по неделям
  9.  
  10. public function __construct($name, $rate)
  11. {
  12. // задаем имя и часовую ставку
  13. $this->name = $name;
  14. $this->rate = $rate;
  15. }
  16.  
  17. /** Считает общее число отработанных часов */
  18. public function getTotalHoursWorked()
  19. {
  20. // Просто складываем значения часов в массиве
  21. return array_sum($this->hours);
  22. }
  23.  
  24. //Считаем количество часов оплачиваемых по обычному тарифу
  25. public function getNormalHours()
  26. {
  27. $total = 0;
  28. foreach ($this->hours as $hours) {
  29. if ($hours > 40) {
  30. $total += 40;
  31. } else {
  32. $total += $hours;
  33. }
  34. }
  35. return $total;
  36. }
  37.  
  38. // Считаем количество часов оплачиваемых по двойному тарифу
  39. public function getOverTimeHours()
  40. {
  41. $total = 0;
  42. foreach ($this->hours as $hours) {
  43. if ($hours > 40) {
  44. $total += $hours - 40;
  45. }
  46. }
  47. return $total;
  48. }
  49.  
  50. /** Считает зарплату */
  51. public function getSalary()
  52. {
  53. // Получаем число отработанных часов
  54. $hours = $this->getNormalHours();
  55. // и умножаем на часовую ставку
  56. $salary = $hours * $this->rate;
  57. //Считаем по двойному тарифу за переработку
  58. $hours = $this->getOverTimeHours();
  59. $salary += $hours * $this->rate*2;
  60. return $salary;
  61. }
  62.  
  63. public function getShortName()
  64. {
  65. return preg_replace('/(\w+ \w).+/u', '$1.', $this->name);
  66. }
  67. }
  68.  
  69. $ivan = new Employee('Иванов Иван', 10);
  70. $ivan->hours = array(40, 40, 40, 40); // Иван работает по 40 часов в неделю
  71.  
  72. $peter = new Employee('Петров Петр', 8);
  73. $peter->hours = array(40, 10, 40, 50); // Петр взял отгул и потому отработал меньше часов,
  74. // но в последнюю неделю решил поработать побольше
  75.  
  76. $employees = array($ivan, $peter);
  77.  
  78. //теперь попробуем использовать методы для вывода полезной информации:
  79.  
  80. function padRight($string, $length)
  81. {
  82. $spaces = $length - mb_strlen($string);
  83. if ($spaces >= 0) {
  84. for ($i = 0; $i < $spaces; ++$i) {
  85. $string .= ' ';
  86. }
  87. return $string;
  88. } else {
  89. return mb_substr($string, 0, $length - 1) . '.';
  90. }
  91. }
  92.  
  93. function padLeft($string, $length)
  94. {
  95. $spaces = $length - mb_strlen($string);
  96. if ($spaces >= 0) {
  97. for ($i = 0; $i < $spaces; ++$i) {
  98. $string = preg_replace('/^/', ' ', $string);
  99. }
  100. return $string;
  101. } else {
  102. return mb_substr($string, 0, $length - 1) . '.';
  103. }
  104. }
  105.  
  106. // Ширина колонок
  107. $col1 = 30;
  108. $col2 = 8;
  109. $col3 = 10;
  110. $col4 = 8;
  111. $col5 = 8;
  112.  
  113. // Заголовок таблицы
  114. echo padRight("Сотрудник", $col1) .
  115. padLeft("Часы", $col2) .
  116. padLeft("Овертайм", $col3) .
  117. padLeft("Ставка", $col4) .
  118. padLeft("З/п", $col5) . "\n\n";
  119.  
  120. $totalHours = 0;
  121. $totalSalary = 0;
  122. $totalOvertime = 0;
  123. // Сама таблица
  124. foreach ($employees as $employee) {
  125. echo padRight($employee->getShortName(), $col1) .
  126. padLeft($employee->getTotalHoursWorked(), $col2) .
  127. padLeft($employee->getOverTimeHours(), $col3) .
  128. padLeft($employee->rate, $col4) .
  129. padLeft($employee->getSalary(), $col5) . "\n";
  130. $totalHours += $employee->getTotalHoursWorked();
  131. $totalSalary += $employee->getSalary();
  132. $totalOvertime += $employee->getOverTimeHours();
  133. }
  134.  
  135. echo padRight('Всего', $col1) .
  136. padLeft($totalHours, $col2) .
  137. padLeft($totalOvertime, $col3) .
  138. padLeft('', $col4) .
  139. padLeft($totalSalary, $col5);
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
Сотрудник                         Часы  Овертайм  Ставка     З/п

Иванов И.                          160         0      10    1600
Петров П.                          140        10       8    1200
Всего                              300        10            2800