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