3v4l.org

run code in 300+ PHP versions simultaneously
<?php error_reporting(-1); abstract class AbstractWorker { private $rank; private $isBoss; private $salary; private $coffee; abstract public function getBasicPages(): int; public function __construct(int $rank, bool $isBoss, int $salary, int $coffee) { $this->rank = $rank; $this->isBoss = $isBoss; $this->coffee = $coffee; $this->salary = $salary; } public function getRank(): int { return $this->rank; } public function changeRank(int $rank): void { $this->rank = $rank; } public function getBoss(): bool { return $this->isBoss; } public function changeBoss(bool $isBoss): void { $this->isBoss = $isBoss; } public function getSalary(): float { $modifiedSalary = $this->salary; if ($this->rank == 2){ $modifiedSalary *= 1.25; } elseif ($this->rank == 3){ $modifiedSalary *= 1.5; } if ($this->isBoss == TRUE){ $modifiedSalary *= 1.5; } return $modifiedSalary; } public function getCoffee(): int { $modifiedCoffee = $this->coffee; if ($this->isBoss == TRUE){ $modifiedCoffee *= 2; } return $modifiedCoffee; } public function getPages(): int { $pages = $this->getBasicPages(); if ($this->isBoss == TRUE){ $pages = 0; } return $pages; } public function changeSalary(float $salary): void { $this->salary = $salary; } public function changeCoffee(int $coffee): void { $this->coffee = $coffee; } } class Manager extends AbstractWorker { public function getBasicPages(): int { return 200; } } class Marketer extends AbstractWorker { public function getBasicPages(): int { return 150; } } class Engineer extends AbstractWorker { public function getBasicPages(): int { return 50; } } class Analyst extends AbstractWorker { public function getBasicPages(): int { return 5; } } class Department { private $name; private $workers = array(); public function __construct(string $name) { $this->name = $name; } public function getName(): string { return $this->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() { $cloneOfCompany = array(); foreach ($this->departments as $department) { $cloneOfDepartment = new Department($department->getName()); foreach ($department->getWorkers() as $worker) { $cloneOfDepartment->addWorker(clone $worker); } $cloneOfCompany[] = $cloneOfDepartment; } $this->departments = $cloneOfCompany; } } class HiringWorkers { public function addWorkersToDepartment(Department $department, string $profession, int $count, int $rank, bool $isBoss, float $salary, int $coffee): void { if ($profession == Manager::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Manager($rank, $isBoss, $salary, $coffee)); } } elseif ($profession == Marketer::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Marketer($rank, $isBoss, $salary, $coffee)); } } elseif ($profession == Engineer::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Engineer ($rank, $isBoss, $salary, $coffee)); } } elseif ($profession == Analyst::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Analyst ($rank, $isBoss, $salary, $coffee)); } } else { throw new Exception("Введено ошибочное название профессии"); } } } class Tabel { 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)); echo "\n"; } 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"; } } class AnticrisisService { public function cutEngineers(Company $basicCompany): void { $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->getRank() == 1){ $countEngineers1Rank++; } elseif (get_class($worker) == Engineer::class && $worker->getRank() == 2){ $countEngineers2Rank++; } elseif (get_class($worker) == Engineer::class && $worker->getRank() == 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)->getBoss() == FALSE && $countEngineers1Rank > 0){ $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers1Rank --; $departmentCount--; } elseif (get_class($department->getWorker($numberOfWorker)) == Engineer::class && $department->getWorker($numberOfWorker)->getBoss() == FALSE && $countEngineers2Rank > 0){ $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers2Rank --; $departmentCount--; } elseif (get_class($department->getWorker($numberOfWorker)) == Engineer::class && $department->getWorker($numberOfWorker)->getBoss() == FALSE && $countEngineers3Rank > 0){ $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers3Rank --; $departmentCount--; } } $department->sortWorkers(); } $this->print($company, "Сокращение инженеров"); } public function changeDataAnalytics(Company $basicCompany): void { $company = clone $basicCompany; foreach ($company->getDepartments() as $department) { $countOfBasicAnalyst = 0; $numberOfBestAnalyst = 0; $rankOfBestAnalyst = 0; $numberOfWorker = -1; foreach ($department->getWorkers() as $worker) { $numberOfWorker++; if (get_class($worker) == Analyst::class){ $worker->changeSalary(1100); $worker->changeCoffee(75); if ($worker->getBoss() == FALSE){ $countOfBasicAnalyst++; if ($worker->getRank() > $rankOfBestAnalyst){ $rankOfBestAnalyst = $worker->getRank(); $numberOfBestAnalyst = $numberOfWorker; } } } } if (get_class($department->getWorker($department->getNumberWorkers()-1)) != Analyst::class && $countOfBasicAnalyst > 0){ $department->getWorker($department->getNumberWorkers()-1)->changeBoss(FALSE); $department->getWOrker($numberOfBestAnalyst)->changeBoss(TRUE); } } $this->print($company, "Стимуляция аналитиков"); } public function increaseManagers(Company $basicCompany): void { $company = clone $basicCompany; foreach ($company->getDepartments() as $department) { $manager1RangCount = 0; $manager2RangCount = 0; foreach ($department->getWorkers() as $worker) { if (get_class($worker) == Manager::class && ($worker->getRank() == 1)){ $manager1RangCount++; } elseif (get_class($worker) == Manager::class && ($worker->getRank() == 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->getRank() == 1 && $manager1RangCount > 0){ $worker->changeRank($worker->getRank()+1); $manager1RangCount--; } elseif (get_class($worker) == Manager::class && $worker->getRank() == 2 && $manager2RangCount > 0) { $worker->changeRank($worker->getRank()+1); $manager2RangCount--; } } } $this->print($company, "Повышение менеджеров"); } private function print(Company $company, string $nameOfAnticrisisMeasures) { echo "===============================================================================\n"; echo "\n$nameOfAnticrisisMeasures\n"; $tabel = new Tabel; $tabel->printTabel($company); } } $vektor = new Company; $tabel = new Tabel; $hiringWorkers = new HiringWorkers; $departmentOfProcurement = new Department("Закупок"); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 9, 1, FALSE, 500, 20); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 3, 2, FALSE, 500, 20); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 2, 3, FALSE, 500, 20); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Marketer", 2, 1, FALSE, 400, 15); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 1, 2, TRUE, 500, 20); $departmentOfSales = new Department("Продаж"); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Manager", 12, 1, FALSE, 500, 20); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Marketer", 6, 1, FALSE, 400, 15); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Analyst", 3, 1, FALSE, 800, 50); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Analyst", 2, 2, FALSE, 800, 50); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Marketer", 1, 2, TRUE, 400, 15); $departmentOfAdvertising = new Department("Рекламы"); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 15, 1, FALSE, 400, 15); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 10, 2, FALSE, 400, 15); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Manager", 8, 1, FALSE, 500, 20); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Engineer", 2, 1, FALSE, 200, 5); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 1, 3, TRUE, 400, 15); $departmentOfLogistics = new Department("Логистики"); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 13, 1, FALSE, 500, 20); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 5, 2, FALSE, 500, 20); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Engineer", 5, 1, FALSE, 200, 5); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 1, 1, TRUE, 500, 20); $vektor->addDepartment($departmentOfProcurement); $vektor->addDepartment($departmentOfSales); $vektor->addDepartment($departmentOfAdvertising); $vektor->addDepartment($departmentOfLogistics); $tabel->printTabel($vektor); $anticrisisService = new AnticrisisService; $anticrisisService->cutEngineers($vektor); $anticrisisService->increaseManagers($vektor); $anticrisisService->changeDataAnalytics($vektor);

This is an error 404

There are `0` results


preferences:
1582.56 ms | 1403 KiB | 21 Q