<?php
// archive-ipq-co.narod.ru
error_reporting(-1);
mb_internal_encoding('utf-8');
 
class Employee             
{
    public $name;               // имя-фамилия
    public $rate;               // часовая ставка (сколько он получает тугриков за час работы)
    public $hours = array();    // массив, содержащий отработанные часы по неделям
 
    public function __construct($name, $rate)
    {
        // задаем имя и часовую ставку
        $this->name = $name;
        $this->rate = $rate;
    }
 
    //Считает общее число отработанных часов
    public function getTotalHoursWorked()
    {
        // Просто складываем значения часов в массиве
        return array_sum($this->hours);
    }
 
    //Считает овертайм
    public function getOvertimeHours()
    {
        $overtimeHours = 0;
        foreach($this->hours as $weeklyHours) {
            $overtimeHours += ($weeklyHours > 40) ? $weeklyHours - 40 : 0;
        }
        return $overtimeHours;
    }
 
    //Считает количество отработанных по графику часов
    public function getNormalHours()
    {
        return $this->getTotalHoursWorked() - $this->getOvertimeHours();
    }
 
    //Считает зарплату
    public function getSalary()
    {
        /** // Получаем число нормально отработанных часов и овертайм
        $normalHours = $this->getNormalHours();
        $overtimeHours = $this->getOvertimeHours();
        // и умножаем на часовую ставку
        $salary = $normalHours * $this->rate + $overtimeHours * 2 * $this->rate;
        return $salary; */
 
        return ($this->getNormalHours() + 2 * $this->getOvertimeHours()) * $this->rate;
    }
}
 
 
$ivan = new Employee("Иванов Иван", 10);
// name и rate заданы через конструктор, потому осталось лишь написать часы
$ivan->hours = array(40, 40, 40, 40);   // Иван работает по 40 часов в неделю
 
$peter = new Employee("Петров Петр", 8);
$peter->hours = array(40, 10, 50, 50);  // Петр взял отгул и потому отработал меньше часов, 
                                        // но в  последние 2 недели решил поработать побольше

$rd = new Employee("Rainbow Dash", 20) ;
$rd->hours = array(60, 60, 60, 60);

$employees = array($ivan, $peter, $rd);
 
//str_pad для многобайтовых строк
function mb_str_pad ($input, $pad_length, $pad_string, $pad_style, $encoding="UTF-8") { 
   return str_pad($input, strlen($input)-mb_strlen($input,$encoding)+$pad_length, $pad_string, $pad_style); 
}
 
//Добавление пробелов справа
function padRight ($string, $length) {
    return mb_str_pad($string, $length, " ", STR_PAD_RIGHT);
}
 
//Добавление пробелов слева
function padLeft ($string, $length) {
    return mb_str_pad($string, $length, " ", STR_PAD_LEFT);
}
 
//Ширина колонок
$col1 = 15;
$col2 = 5;
$col3 = 8;
$col4 = 8;
$col5 = 10;
 
//Заголовок таблицы
echo padRight("Сотрудник", $col1) . 
     padLeft("Часы", $col2) . 
     padLeft("Овертайм", $col5) . 
     padLeft("Ставка", $col3) . 
     padLeft("З/п", $col4) . "\n";

$allEmployeesNormalHours = 0;
$allEmployeesOvertimeHours = 0;
$allEmployeesSalary = 0;

//Таблица
foreach ($employees as $employee) {
    $allEmployeesNormalHours += $employee->getNormalHours();
    $allEmployeesOvertimeHours += $employee->getOvertimeHours();
    $allEmployeesSalary += $employee->getSalary();
    echo padRight($employee->name, $col1) .
         padLeft($employee->getNormalHours(), $col2) . 
         padLeft($employee->getOvertimeHours(), $col5) .
         padLeft($employee->rate, $col3) . 
         padLeft($employee->getSalary(), $col4) . "\n";
     }
     
//Вывод рабочего времени и зарплаты всех сотрудников
    echo padRight("Всего", $col1) . 
         padLeft($allEmployeesNormalHours, $col2) . 
         padLeft($allEmployeesOvertimeHours, $col5) . 
         padLeft("", $col3) .
         padLeft($allEmployeesSalary, $col4) . "\n";
?>