3v4l.org

run code in 200+ php & hhvm versions
<?php abstract class AbstractEmployee { protected $rank; protected $isBoss; public function __construct(int $rank, bool $isBoss) { $this->rank = $rank; $this->isBoss = $isBoss; } abstract function getBasicSalary(): float; abstract function getBasicCoffee(): float; abstract function getBasicPages(): float; public function getSalary(): float { $salary = $this->getBasicSalary(); if ($this->rank == 2) { $salary *= 1.25; } elseif ($this->rank == 3) { $salary *= 1.5; } if ($this->isBoss == true) { $salary *= 1.5; } return round($salary, 1); } public function getCoffee(): float { $coffee = $this->getBasicCoffee(); if ($this->isBoss == true) { $coffee *= 2; } return $coffee; } public function getPages(): float { $pages = $this->getBasicPages(); if ($this->isBoss == true) { $pages = 0; } return $pages; } } class Manager extends AbstractEmployee { public function getBasicSalary(): float { return 500; } public function getBasicCoffee(): float { return 20; } public function getBasicPages(): float { return 200; } } class Marketer extends AbstractEmployee { public function getBasicSalary(): float { return 400; } public function getBasicCoffee(): float { return 15; } public function getBasicPages(): float { return 150; } } class Engineer extends AbstractEmployee { public function getBasicSalary(): float { return 200; } public function getBasicCoffee(): float { return 5; } public function getBasicPages(): float { return 50; } } class Analyst extends AbstractEmployee { public function getBasicSalary(): float { return 800; } public function getBasicCoffee(): float { return 50; } public function getBasicPages(): float { return 5; } } class Department { private $name; private $employees = array(); public function __construct(string $name) { $this->name = $name; } public function addEmployees(int $count, string $profession, int $rank, bool $isBoss): void { if ($profession == "Manager") { for ($i = 0; $i < $count; $i++) { $this->employees[] = new Manager($rank, $isBoss); } } elseif ($profession == "Marketer") { for ($i = 0; $i < $count; $i++) { $this->employees[] = new Marketer($rank, $isBoss); } } elseif ($profession == "Engineer") { for ($i = 0; $i < $count; $i++) { $this->employees[] = new Engineer($rank, $isBoss); } } elseif ($profession == "Analyst") { for ($i = 0; $i < $count; $i++) { $this->employees[] = new Analyst($rank, $isBoss); } } } public function getInformation(): array { $information = array(); $information['name'] = $this->name; $information['employeesCount'] = count($this->employees); $information['selary'] = 0; $information['coffee'] = 0; $information['pages'] = 0; foreach ($this->employees as $employee) { $information['selary'] += $employee->getSalary(); $information['coffee'] += $employee->getCoffee(); $information['pages'] += $employee->getPages(); } return $information; } } class Vektor { private $departments = array(); public function addDepartment (Department $department): void { $this->departments[] = $department; } public function getDepartments(): array { return $this->departments; } public function getDepartmentsCount(): int { return count($this->departments); } } class Table { public function printTable (Vektor $vektor): void { $this->printLine("Департамент", "сотр.", "тугр.", "кофе", "стр.", "тугр/стр."); echo str_repeat("-", 70); echo "\n"; $employeesCount = 0; $totalSelary = 0; $totalCoffee = 0; $totalPages = 0; $totalSelarySharePages = 0; foreach ($vektor->getDepartments() as $department) { $employeesCount += $department->getInformation()['employeesCount']; $totalSelary += $department->getInformation()['selary']; $totalCoffee += $department->getInformation()['coffee']; $totalPages += $department->getInformation()['pages']; $totalSelarySharePages += $totalSelary / $totalPages; $this->printLine($department->getInformation()['name'], $department->getInformation()['employeesCount'], $department->getInformation()['selary'], $department->getInformation()['coffee'], $department->getInformation()['pages'], round($department->getInformation()['selary'] / $department->getInformation()['pages']), 1); } echo "\n"; $this->printLine("Среднее", round($employeesCount / $vektor->getDepartmentsCount(), 1), round($totalSelary / $vektor->getDepartmentsCount(), 1), round($totalCoffee / $vektor->getDepartmentsCount(), 1), round($totalPages / $vektor->getDepartmentsCount(), 1), round($totalSelarySharePages / $vektor->getDepartmentsCount(), 1)); $this->printLine("Всего", $employeesCount, $totalSelary, $totalCoffee, $totalPages, round($totalSelarySharePages, 1)); } private function printLine(string $title, $employees, $salary, $coffee, $pages, $salarySharePages): void { echo $this->padRight($title, 15); $this->padLeft($employees, 10) . $this->padLeft($salary, 10) . $this->padLeft($coffee, 10) . $this->padLeft($pages, 10) . $this->padLeft($salarySharePages, 15); echo "\n"; } private function padLeft ($field, int $col): void { echo str_repeat(" ", $col - mb_strlen($field)).$field; } private function padRight ($field, int $col) { echo $field.str_repeat(" ", $col - mb_strlen($field)); } } $procurementDepartment = new Department("Закупок"); $procurementDepartment->addEmployees(9, "Manager", 1, false); $procurementDepartment->addEmployees(3, "Manager", 2, false); $procurementDepartment->addEmployees(2, "Manager", 3, false); $procurementDepartment->addEmployees(2, "Marketer", 1, false); $procurementDepartment->addEmployees(1, "Manager", 2, true); $salesDepartment = new Department("Продаж"); $salesDepartment->addEmployees(12, "Manager", 1, false); $salesDepartment->addEmployees(6, "Marketer", 1, false); $salesDepartment->addEmployees(3, "Analyst", 1, false); $salesDepartment->addEmployees(2, "Analyst", 2, false); $salesDepartment->addEmployees(1, "Marketer", 2, true); $advertisingDepartment = new Department("Рекламы"); $advertisingDepartment->addEmployees(15, "Marketer", 1, false); $advertisingDepartment->addEmployees(10, "Marketer", 2, false); $advertisingDepartment->addEmployees(8, "Manager", 1, false); $advertisingDepartment->addEmployees(2, "Engineer", 1, false); $advertisingDepartment->addEmployees(1, "Marketer", 3, true); $logisticsDepartment = new Department("Логистики"); $logisticsDepartment->addEmployees(13, "Manager", 1, false); $logisticsDepartment->addEmployees(5, "Manager", 2, false); $logisticsDepartment->addEmployees(5, "Engineer", 1, false); $logisticsDepartment->addEmployees(1, "Manager", 1, true); $vektor = new Vektor(); $vektor->addDepartment($procurementDepartment); $vektor->addDepartment($salesDepartment); $vektor->addDepartment($advertisingDepartment); $vektor->addDepartment($logisticsDepartment); $table = new Table(); $table->printTable($vektor);
based on PuZRs
Output for 7.1.25 - 7.3.2
Департамент сотр. тугр. кофе стр. тугр/стр. ---------------------------------------------------------------------- Закупок 17 9612.5 350 3100 3 Продаж 24 13550 610 3325 4 Рекламы 36 16300 575 5450 3 Логистики 24 11375 425 3850 3 Среднее 25.3 12709.4 490 3931.3 3.3 Всего 101 50837.5 1960 15725 13.3