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. return $string . str_repeat(' ', $length - mb_strlen($string));
  75.  
  76. }
  77.  
  78. function padLeft($string, $length)
  79. {
  80. return str_repeat(' ', $length - mb_strlen($string)) . $string;
  81. }
  82.  
  83. // Ширина колонок
  84. $col1 = 30;
  85. $col2 = 8;
  86. $col3 = 10;
  87. $col4 = 8;
  88. $col5 = 8;
  89.  
  90. // Заголовок таблицы
  91. echo padRight("Сотрудник", $col1) .
  92. padLeft("Часы", $col2) .
  93. padLeft("Овертайм", $col3) .
  94. padLeft("Ставка", $col4) .
  95. padLeft("З/п", $col5) . "\n\n";
  96.  
  97. $totalHours = 0;
  98. $totalSalary = 0;
  99. $totalOvertime = 0;
  100. // Сама таблица
  101. foreach ($employees as $employee) {
  102. echo padRight($employee->getShortName(), $col1) .
  103. padLeft($employee->getTotalHoursWorked(), $col2) .
  104. padLeft($employee->getOverTimeHours(), $col3) .
  105. padLeft($employee->rate, $col4) .
  106. padLeft($employee->getSalary(), $col5) . "\n";
  107. $totalHours += $employee->getTotalHoursWorked();
  108. $totalSalary += $employee->getSalary();
  109. $totalOvertime += $employee->getOverTimeHours();
  110. }
  111.  
  112. echo padRight('Всего', $col1) .
  113. padLeft($totalHours, $col2) .
  114. padLeft($totalOvertime, $col3) .
  115. padLeft('', $col4) .
  116. 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