fork download
  1. <?php
  2. // archive-ipq-co.narod.ru
  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 getOvertimeHours()
  26. {
  27. $overtimeHours = 0;
  28. foreach($this->hours as $weeklyHours) {
  29. $overtimeHours += ($weeklyHours > 40) ? $weeklyHours - 40 : 0;
  30. }
  31. return $overtimeHours;
  32. }
  33.  
  34. //Считает количество отработанных по графику часов
  35. public function getNormalHours()
  36. {
  37. return $this->getTotalHoursWorked() - $this->getOvertimeHours();
  38. }
  39.  
  40. //Считает зарплату
  41. public function getSalary()
  42. {
  43. /** // Получаем число нормально отработанных часов и овертайм
  44.   $normalHours = $this->getNormalHours();
  45.   $overtimeHours = $this->getOvertimeHours();
  46.   // и умножаем на часовую ставку
  47.   $salary = $normalHours * $this->rate + $overtimeHours * 2 * $this->rate;
  48.   return $salary; */
  49.  
  50. return ($this->getNormalHours() + 2 * $this->getOvertimeHours()) * $this->rate;
  51. }
  52. }
  53.  
  54.  
  55. $ivan = new Employee("Иванов Иван", 10);
  56. // name и rate заданы через конструктор, потому осталось лишь написать часы
  57. $ivan->hours = array(40, 40, 40, 40); // Иван работает по 40 часов в неделю
  58.  
  59. $peter = new Employee("Петров Петр", 8);
  60. $peter->hours = array(40, 10, 50, 50); // Петр взял отгул и потому отработал меньше часов,
  61. // но в последние 2 недели решил поработать побольше
  62.  
  63. $rd = new Employee("Rainbow Dash", 20) ;
  64. $rd->hours = array(60, 60, 60, 60);
  65.  
  66. $employees = array($ivan, $peter, $rd);
  67.  
  68. //str_pad для многобайтовых строк
  69. function mb_str_pad ($input, $pad_length, $pad_string, $pad_style, $encoding="UTF-8") {
  70. return str_pad($input, strlen($input)-mb_strlen($input,$encoding)+$pad_length, $pad_string, $pad_style);
  71. }
  72.  
  73. //Добавление пробелов справа
  74. function padRight ($string, $length) {
  75. return mb_str_pad($string, $length, " ", STR_PAD_RIGHT);
  76. }
  77.  
  78. //Добавление пробелов слева
  79. function padLeft ($string, $length) {
  80. return mb_str_pad($string, $length, " ", STR_PAD_LEFT);
  81. }
  82.  
  83. //Ширина колонок
  84. $col1 = 15;
  85. $col2 = 5;
  86. $col3 = 8;
  87. $col4 = 8;
  88. $col5 = 10;
  89.  
  90. //Заголовок таблицы
  91. echo padRight("Сотрудник", $col1) .
  92. padLeft("Часы", $col2) .
  93. padLeft("Овертайм", $col5) .
  94. padLeft("Ставка", $col3) .
  95. padLeft("З/п", $col4) . "\n";
  96.  
  97. $allEmployeesNormalHours = 0;
  98. $allEmployeesOvertimeHours = 0;
  99. $allEmployeesSalary = 0;
  100.  
  101. //Таблица
  102. foreach ($employees as $employee) {
  103. $allEmployeesNormalHours += $employee->getNormalHours();
  104. $allEmployeesOvertimeHours += $employee->getOvertimeHours();
  105. $allEmployeesSalary += $employee->getSalary();
  106. echo padRight($employee->name, $col1) .
  107. padLeft($employee->getNormalHours(), $col2) .
  108. padLeft($employee->getOvertimeHours(), $col5) .
  109. padLeft($employee->rate, $col3) .
  110. padLeft($employee->getSalary(), $col4) . "\n";
  111. }
  112.  
  113. //Вывод рабочего времени и зарплаты всех сотрудников
  114. echo padRight("Всего", $col1) .
  115. padLeft($allEmployeesNormalHours, $col2) .
  116. padLeft($allEmployeesOvertimeHours, $col5) .
  117. padLeft("", $col3) .
  118. padLeft($allEmployeesSalary, $col4) . "\n";
  119. ?>
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
Сотрудник       Часы  Овертайм  Ставка     З/п
Иванов Иван      160         0      10    1600
Петров Петр      130        20       8    1360
Rainbow Dash     160        80      20    6400
Всего            450       100            9360