<?php

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 getNormalHours()
    {
        $normal = 40;
        $total = 0;
        foreach ($this->hours as $hours) {
            $total += min($normal, $hours);
        }
        return $total;
    }

    // Считаем количество часов оплачиваемых по двойному тарифу
    public function getOverTimeHours()
    {
        return $this->getTotalHoursWorked() - $this->getNormalHours();
    }

    /** Считает зарплату */
    public function getSalary()
    {
        // Получаем число отработанных часов
        $hours = $this->getNormalHours();
        // и умножаем на часовую ставку
        $salary = $hours * $this->rate;
        //Считаем по двойному тарифу за переработку
        $hours = $this->getOverTimeHours();
        $salary += $hours * $this->rate * 2;
        return $salary;
    }

    public function getShortName()
    {
        return preg_replace('/(\w+ \w).+/u', '$1.', $this->name);
    }
}

$ivan = new Employee('Иванов Иван', 10);
$ivan->hours = array(40, 40, 40, 40); // Иван работает по 40 часов в неделю

$peter = new Employee('Петров Петр', 8);
$peter->hours = array(40, 10, 40, 50); // Петр взял отгул и потому отработал меньше часов,
// но в  последнюю неделю решил поработать побольше

$employees = array($ivan, $peter);

//теперь попробуем использовать методы для вывода полезной информации:

//Функции генерирующие отступ для строки слева и справа
function padRight($string, $length)
{
    $spaces = $length - mb_strlen($string);
    if ($spaces >= 0) {
        return $string . str_repeat(' ', $spaces);
    } else {
        return ' ' . mb_substr($string, 0, $length - 2) . '.';
    }
}

function padLeft($string, $length)
{
    $spaces = $length - mb_strlen($string);
    if ($spaces >= 0) {
        return str_repeat(' ', $spaces) . $string;
    } else {
        return ' ' . mb_substr($string, 0, $length - 2) . '.';
    }
}

// Ширина колонок
$col1 = 30;
$col2 = 8;
$col3 = 10;
$col4 = 8;
$col5 = 8;

// Заголовок таблицы
echo padRight("Сотрудник", $col1) .
    padLeft("Часы", $col2) .
    padLeft("Овертайм", $col3) .
    padLeft("Ставка", $col4) .
    padLeft("З/п", $col5) . "\n\n";

$totalHours = 0;
$totalSalary = 0;
$totalOvertime = 0;
// Сама таблица
foreach ($employees as $employee) {
    echo padRight($employee->getShortName(), $col1) .
        padLeft($employee->getTotalHoursWorked(), $col2) .
        padLeft($employee->getOverTimeHours(), $col3) .
        padLeft($employee->rate, $col4) .
        padLeft($employee->getSalary(), $col5) . "\n";
    $totalHours += $employee->getTotalHoursWorked();
    $totalSalary += $employee->getSalary();
    $totalOvertime += $employee->getOverTimeHours();
}

echo padRight('Всего', $col1) .
    padLeft($totalHours, $col2) .
    padLeft($totalOvertime, $col3) .
    padLeft('', $col4) .
    padLeft($totalSalary, $col5);