3v4l.org

run code in 300+ PHP versions simultaneously
<?php error_reporting(-1); abstract class AbstractWorker { public $rank; public $isBoss; public function __construct(int $rank, int $isBoss) { $this->rank = $rank; $this->isBoss = $isBoss; } public function getSalary(): float { $salary = $this->getBasicSalary(); if ($this->rank == 2){ $salary *= 1.25; } elseif ($this->rank == 3){ $salary *= 1.5; } if ($this->isBoss == 1){ $salary *= 1.5; } return $salary; } public function getCoffee(): int { $coffee = $this->getBasicCoffee(); if ($this->isBoss == 1){ $coffee *= 2; } return $coffee; } public function getPages(): int { $pages = $this->getBasicPages(); if ($this->isBoss == 1){ $pages = 0; } return $pages; } abstract public function getBasicSalary(): int; abstract public function getBasicCoffee(): int; abstract public function getBasicPages(): int; } class Manager extends AbstractWorker { public function getBasicSalary(): int { return 500; } public function getBasicCoffee(): int { return 20; } public function getBasicPages(): int { return 200; } } class Marketer extends AbstractWorker { public function getBasicSalary(): int { return 400; } public function getBasicCoffee(): int { return 15; } public function getBasicPages(): int { return 150; } } class Engineer extends AbstractWorker { public function getBasicSalary(): int { return 200; } public function getBasicCoffee(): int { return 5; } public function getBasicPages(): int { return 50; } } class Analyst extends AbstractWorker { public function getBasicSalary(): int { return 800; } public function getBasicCoffee(): int { return 50; } public function getBasicPages(): int { return 5; } } class Department { private $name; private $workers = array(); public function __construct(string $name) { $this->name = $name; } public function addWorker(AbstractWorker $worker): void { $this->workers[] = $worker; } public function getNumberWorkers(): int { return count($this->workers); } public function getDepartmentSalary(): float { $totalSalary = 0; foreach ($this->workers as $worker) { $totalSalary += $worker->getSalary(); } return $totalSalary; } public function getDepartmentCoffee(): int { $totalCoffee = 0; foreach ($this->workers as $worker) { $totalCoffee += $worker->getCoffee(); } return $totalCoffee; } public function getDepartmentPages(): int { $totalPages = 0; foreach ($this->workers as $worker) { $totalPages += $worker->getPages(); } return $totalPages; } public function getDepartmentName(): string { return $this->name; } public function getWorkers(): array { return $this->workers; } public function getWorker(int $number): AbstractWorker { return $this->workers[$number]; } public function deleteWorker(int $number): void { unset($this->workers[$number]); } public function sortWorkers(): void { sort($this->workers); } } class Company { private $departments = array(); public function addDepartment(Department $department): void { $this->departments[] = $department; } public function getDepartments(): array { return $this->departments; } public function getDepartmentCount(): int { return count($this->departments); } public function __clone() { $cloneDepartment = array(); foreach ($this->departments as $department) { $cloneDepartment[] = clone $department; } $this->departments = $cloneDepartment; } } class HiringWorkers { public function addWorkersToDepartment(Department $department, string $profession, int $count, int $rank, int $isBoss): void { if ($profession == Manager::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Manager($rank, $isBoss)); } } elseif ($profession == Marketer::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Marketer($rank, $isBoss)); } } elseif ($profession == Engineer::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Engineer ($rank, $isBoss)); } } elseif ($profession == Analyst::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Analyst ($rank, $isBoss)); } } } } class Tabel { private function padLeft($value, $columnLength): void { echo $value; echo str_repeat(" ", $columnLength - mb_strlen($value)); } private function printRow(string $name, $count, $salary, $coffee, $pages, $salaryDividePages): void { $col1 = 15; $col2 = 10; $col3 = 10; $col4 = 8; $col5 = 8; $col6 = 15; echo $this->padLeft($name, $col1) . $this->padLeft($count, $col2) . $this->padLeft($salary, $col3) . $this->padLeft($coffee, $col4) . $this->padLeft($pages, $col5) . $this->padLeft($salaryDividePages, $col6) . "\n"; } public function printTabel(Company $company): void { $this->printRow("Департамент", "сотр.", "тугр.", "кофе", "стр", "тугр./стр."); echo "\n"; foreach ($company->getDepartments() as $department) { $this->printRow($department->getDepartmentName(), $department->getNumberWorkers(), $department->getDepartmentSalary(), $department->getDepartmentCoffee(), $department->getDepartmentPages(), round($department->getDepartmentSalary() / $department->getDepartmentPages(), 1)); } echo "\n"; $count = 0; $salary = 0; $coffee = 0; $pages = 0; $salaryDividePages = 0; foreach ($company->getDepartments() as $department) { $count += $department->getNumberWorkers(); $salary += $department->getDepartmentSalary(); $coffee += $department->getDepartmentCoffee(); $pages += $department->getDepartmentPages(); $salaryDividePages += round($salary / $pages, 1); } $this->printRow("Всего", $count, $salary, $coffee, $pages, $salaryDividePages); $this->printRow("Среднее", round($count / $company->getDepartmentCount(), 1), round($salary / $company->getDepartmentCount(), 1), round($coffee / $company->getDepartmentCount(), 1), round($pages / $company->getDepartmentCount(), 1), round($salaryDividePages / $company->getDepartmentCount(), 1)); } } class AnticrisisSolutions { public function cutEngineers(Company $basicCompany): void { echo "\n\nСокращение инженеров \n\n"; $company = clone $basicCompany; foreach ($company->getDepartments() as $department) { $countEngineers3Rank = 0; $countEngineers2Rank = 0; $countEngineers1Rank = 0; foreach ($department->getWorkers() as $worker) { if (get_class($worker) == Engineer::class && $worker->rank == 1){ $countEngineers1Rank++; } elseif (get_class($worker) == Engineer::class && $worker->rank == 2){ $countEngineers2Rank++; } elseif (get_class($worker) == Engineer::class && $worker->rank == 3){ $countEngineers3Rank++; } } $engineerCount = $countEngineers1Rank + $countEngineers2Rank + $countEngineers3Rank; if ($engineerCount == 0){ continue; } $numberOfAbbreviatedEngineers = ceil($engineerCount / 2.5); for ($i = $numberOfAbbreviatedEngineers; $i > 0; $i--){ if ($countEngineers1Rank >= $numberOfAbbreviatedEngineers){ $countEngineers1Rank = $numberOfAbbreviatedEngineers; $countEngineers2Rank = 0; $countEngineers3Rank = 0; } elseif ($countEngineers1Rank + $countEngineers2Rank >= $numberOfAbbreviatedEngineers){ $countEngineers2Rank = $numberOfAbbreviatedEngineers - $countEngineers1Rank; $countEngineers3Rank = 0; } else { $countEngineers3Rank = $numberOfAbbreviatedEngineers - $countEngineers1Rank - $countEngineers2Rank; } } $departmentCount = $department->getNumberWorkers(); for ($numberOfWorker = 0; $numberOfWorker < $departmentCount && $numberOfAbbreviatedEngineers != 0; $numberOfWorker++){ if (get_class($department->getWorker($numberOfWorker)) == Engineer::class && $department->getWorker($numberOfWorker)->isBoss == 0 && $countEngineers1Rank > 0){ $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers1Rank --; } elseif (get_class($department->getWorker($numberOfWorker)) == Engineer::class && $department->getWorker($numberOfWorker)->isBoss == 0 && $countEngineers2Rank > 0){ $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers2Rank --; } else { $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers3Rank --; } } $department->sortWorkers(); } $tabel = new Tabel; $tabel->printTabel($company); } public function changeDataAnalytics() { } public function increaseManagers(Company $basicCompany): void { echo "\n\nПовышение менеджеров \n\n"; $company = clone $basicCompany; $manager1RangCount = 0; $manager2RangCount = 0; foreach ($company->getDepartments() as $department) { $manager1RangCount++; $manager2RangCount++; foreach ($department->getWorkers() as $worker) { if (get_class($worker) == Manager::class && ($worker->rank == 1)){ $manager1RangCount++; } elseif (get_class($worker) == Manager::class && ($worker->rank == 2)){ $manager2RangCount++; } } $manager1RangCount = ceil($manager1RangCount / 2); $manager2RangCount = ceil($manager2RangCount / 2); foreach ($department->getWorkers() as $worker) { if($manager1RangCount + $manager2RangCount == 0){ break; } if (get_class($worker) == Manager::class && $worker->rank == 1 && $manager1RangCount > 0){ $worker->rank++; $manager1RangCount--; } elseif (get_class($worker) == Manager::class && $worker->rank == 2 && $manager2RangCount > 0) { $worker->rank++; $manager2RangCount--; } } } $tabel = new Tabel; $tabel->printTabel($company); } } $vektor = new Company; $tabel = new Tabel; $hiringWorkers = new HiringWorkers; $departmentOfProcurement = new Department("Закупок"); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 9, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 3, 2, 0); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 2, 3, 0); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Marketer", 2, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 1, 2, 1); $departmentOfSales = new Department("Продаж"); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Manager", 12, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Marketer", 6, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Analyst", 3, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Analyst", 2, 2, 0); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Marketer", 1, 2, 1); $departmentOfAdvertising = new Department("Рекламы"); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 15, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 10, 2, 0); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Manager", 8, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Engineer", 2, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 1, 3, 1); $departmentOfLogistics = new Department("Логистики"); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 13, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 5, 2, 0); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Engineer", 5, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 1, 1, 1); $vektor->addDepartment($departmentOfProcurement); $vektor->addDepartment($departmentOfSales); $vektor->addDepartment($departmentOfAdvertising); $vektor->addDepartment($departmentOfLogistics); $tabel->printTabel($vektor); $anticrisisSolutions = new AnticrisisSolutions; $anticrisisSolutions->cutEngineers($vektor); $anticrisisSolutions->increaseManagers($vektor);

This is an error 404

There are `0` results


preferences:
1547.58 ms | 1403 KiB | 21 Q