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

Иванов Иван (И.И.)                 |    160|       10|        0|           1600 (1600+0)
Петров Петр (П.П.)                 |    140|        8|       10|         1200 (1040+160)
Владимир Владимирович (В.В.)       |    400|       90|      240|     57600 (14400+43200)
Мария Ивановна Петрова (М.И.П.)    |    120|        6|       20|           840 (600+240)