fork download
  1. <?php
  2.  
  3.  
  4. class Employee // employee значит «сотрудник»
  5. {
  6. public $name; // имя-фамилия
  7. public $rate; // часовая ставка (сколько он получает тугриков за час работы)
  8. public $hours = array(); // массив, содержащий отработанные часы по неделям
  9.  
  10. /* Считает общее число отработанных часов */
  11. public function getTotalHoursWorked()
  12. {
  13. // Просто складываем значения часов в массиве
  14. return array_sum($this->hours);
  15. }
  16.  
  17. /* Считает зарплату */
  18. public function getSalary()
  19. {
  20. // Получаем число отработанных часов
  21. $hours = $this->getTotalHoursWorked();
  22. // и умножаем на часовую ставку
  23. $salary = $hours * $this->rate;
  24. return $salary;
  25. }
  26. /* "Волшебный" метод */
  27. public function __construct($name, $rate)
  28. {
  29. // задаем имя и часовую ставку
  30. $this->name = $name;
  31. $this->rate = $rate;
  32. }
  33. public function getNormalHours() {
  34. $normalHours = 0;
  35. foreach ($this->hours as $hoursAWeek) {
  36. if ($hoursAWeek <= 40) {
  37. $normalHours += $hoursAWeek;
  38. }
  39. }
  40. return $normalHours;
  41. }
  42. public function getOvertimeHours() {
  43. $overtime = 0;
  44. foreach ($this->hours as $hoursAWeek) {
  45. if ($hoursAWeek > 40) {
  46. $overtime += ($hoursAWeek - 40);
  47. }
  48. }
  49. return $overtime;
  50. }
  51.  
  52. }
  53.  
  54. function padRight($x, $y){
  55. $i = preg_split('//u', $x);
  56. $o = mb_strlen($x);
  57. $p = array_fill(0, $y-$o, " ");
  58. $a = array_merge($i, $p);
  59. $tableCell = implode("", $a);
  60. return $tableCell;
  61. }
  62. function padLeft($x, $y){
  63. $i = preg_split('//u', $x);
  64. $o = mb_strlen($x);
  65. $p = array_fill(0, $y-$o, " ");
  66. $a = array_merge($p, $i);
  67. $tableCell = implode("", $a);
  68. return $tableCell;
  69. }
  70.  
  71. // Ширина колонок
  72. $col1 = 20;
  73. $col2 = $col4 = $col5 = 8;
  74. $col3 = 10;
  75.  
  76. $ivan = new Employee("Иванов Иван", 10);
  77. // name и rate заданы через конструктор, потому осталось лишь написать часы
  78. $ivan->hours = array(40, 40, 40, 40); // Иван работает по 40 часов в неделю
  79.  
  80. $peter = new Employee("Петров Петр", 8);
  81. $peter->hours = array(40, 10, 40, 50); // но в последнюю неделю решил поработать побольше
  82.  
  83. $employees = array($ivan, $peter);
  84.  
  85. // Заголовок таблицы
  86. echo padRight("Сотрудник", $col1) .
  87. padLeft("Часы", $col2) .
  88. padLeft("Овертайм", $col3) .
  89. padLeft("Ставка", $col4) .
  90. padLeft("З/п", $col5) . "\n";
  91.  
  92. // Сама таблица
  93. $overtime = 0;
  94. foreach ($employees as $employee) {
  95. echo padRight($employee->name, $col1) .
  96. padLeft($employee->getTotalHoursWorked(), $col2) .
  97. padLeft($employee->getOvertimeHours(), $col3) .
  98. padLeft($employee->rate, $col4) .
  99. padLeft($employee->getSalary(), $col5) . "\n";
  100. if ($employee->getOvertimeHours() > 0) {
  101. $overtime += $employee->getOvertimeHours();
  102. }
  103. };
  104. $salary = $overtime * $employee->rate;
  105. var_dump($salary);
  106. echo padRight("Всего:", $col1) .
  107. padLeft($ivan->getTotalHoursWorked() + $peter->getTotalHoursWorked(), $col2) .
  108. padLeft($overtime, $col3) .
  109. padLeft(null, $col4) .
  110. padLeft($ivan->getSalary() + $peter->getSalary(), $col5) . "\n";
Success #stdin #stdout 0.03s 52480KB
stdin
Standard input is empty
stdout
Сотрудник               Часы  Овертайм  Ставка     З/п
Иванов Иван              160         0      10    1600
Петров Петр              140        10       8    1120
int(80)
Всего:                   300        10            2720