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. $normal = 40;
  28. $total = 0;
  29. foreach ($this->hours as $hours) {
  30. $total += min($normal, $hours);
  31. }
  32. return $total;
  33. }
  34.  
  35. // Считаем количество часов оплачиваемых по двойному тарифу
  36. public function getOverTimeHours()
  37. {
  38. return $this->getTotalHoursWorked() - $this->getNormalHours();
  39. }
  40.  
  41. /** Считает зарплату */
  42. public function getSalary()
  43. {
  44. // Получаем число отработанных часов
  45. $hours = $this->getNormalHours();
  46. // и умножаем на часовую ставку
  47. $salary = $hours * $this->rate;
  48. //Считаем по двойному тарифу за переработку
  49. $hours = $this->getOverTimeHours();
  50. $salary += $hours * $this->rate * 2;
  51. return $salary;
  52. }
  53.  
  54. public function getShortName()
  55. {
  56. return preg_replace('/(\w+ \w).+/u', '$1.', $this->name);
  57. }
  58. }
  59.  
  60. $ivan = new Employee('Иванов Иван', 10);
  61. $ivan->hours = array(40, 40, 40, 40); // Иван работает по 40 часов в неделю
  62.  
  63. $peter = new Employee('Петров Петр', 8);
  64. $peter->hours = array(40, 10, 40, 50); // Петр взял отгул и потому отработал меньше часов,
  65. // но в последнюю неделю решил поработать побольше
  66.  
  67. $employees = array($ivan, $peter);
  68.  
  69. //теперь попробуем использовать методы для вывода полезной информации:
  70.  
  71. //Функции генерирующие отступ для строки слева и справа
  72. function padRight($string, $length)
  73. {
  74. $spaces = $length - mb_strlen($string);
  75. if ($spaces >= 0) {
  76. return $string . str_repeat(' ', $spaces);
  77. } else {
  78. return ' ' . mb_substr($string, 0, $length - 2) . '.';
  79. }
  80. }
  81.  
  82. function padLeft($string, $length)
  83. {
  84. $spaces = $length - mb_strlen($string);
  85. if ($spaces >= 0) {
  86. return str_repeat(' ', $spaces) . $string;
  87. } else {
  88. return ' ' . mb_substr($string, 0, $length - 2) . '.';
  89. }
  90. }
  91.  
  92. // Ширина колонок
  93. $col1 = 30;
  94. $col2 = 8;
  95. $col3 = 10;
  96. $col4 = 8;
  97. $col5 = 8;
  98.  
  99. // Заголовок таблицы
  100. echo padRight("Сотрудник", $col1) .
  101. padLeft("Часы", $col2) .
  102. padLeft("Овертайм", $col3) .
  103. padLeft("Ставка", $col4) .
  104. padLeft("З/п", $col5) . "\n\n";
  105.  
  106. $totalHours = 0;
  107. $totalSalary = 0;
  108. $totalOvertime = 0;
  109. // Сама таблица
  110. foreach ($employees as $employee) {
  111. echo padRight($employee->getShortName(), $col1) .
  112. padLeft($employee->getTotalHoursWorked(), $col2) .
  113. padLeft($employee->getOverTimeHours(), $col3) .
  114. padLeft($employee->rate, $col4) .
  115. padLeft($employee->getSalary(), $col5) . "\n";
  116. $totalHours += $employee->getTotalHoursWorked();
  117. $totalSalary += $employee->getSalary();
  118. $totalOvertime += $employee->getOverTimeHours();
  119. }
  120.  
  121. echo padRight('Всего', $col1) .
  122. padLeft($totalHours, $col2) .
  123. padLeft($totalOvertime, $col3) .
  124. padLeft('', $col4) .
  125. 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