Давай для начала посмотрим на ошибки, а потом придумаем способ исправить. 

Ты решил сделать 1 класс, который обозначает Работника и 1 класс который 
представляет Депарамент. Но при этом код, относящийся чисто к Работнику, 
ты размазал по всей программе вместо того чтобы заключить его в одном классе. 

Например, расчет зарплаты: 

>  $k = $key > 0 ? ($key > 1 ? 1.5 : 1.25) : 1; 

помещен в функцию countDep() которая рассчитывает суммы по департаментам.

Допустим мы захотели дополнительно вывести поименный список всех работников 
департамента продаж с указанием зарплаты каждого. Как это сделать в твоем коде,
если расчет зарплаты засунут в функцию countDep()? Копипастить? Это одна из самых плохих вещей которые может сделать программист. 

Получается, с твоим подходом мы зайдем в тупик. Это говорит о том, что расчет 
зарплаты надо было поместить в класс Работник, в этом случае мы можем из любого 
места программы вызвать: 

зарплата = работник.посчитатьЗарплату();

Это было бы правильно, в стиле ООП.

Код расчета общей зарплаты по департаменту естественно должен быть в классе 
Департамент.

Это были ошибки связанные с использованием ООП. Теперь пройдемся по обычным 
ошибкам.

> public $meEmployees = array(0, 0, 0); 
Ты на каждую профессию сделал отдельное свойство. Посчитай, в скольких 
местах придется переделывать код, чтобы добавить новую профессию? В правильной 
ООП-программе для этого достаточно было бы добавить 1 класс не трогая 
существующие.

Также, я смотрю на эти 0, 0, 0 и не понимаю, что они значат. То есть сейчас я 
догадываюсь что это ранги, но это абсолютно не очевидно и нули никак не 
подписаны. Это плохо.

>  //array(type=>lvl)
Это комментарии как бы намекают что код настолько запутанный что приходится 
его комментировать.

Плюс, представь, мы захотим еще добавить, кроме ранга, опыт в годах и менять 
зарплату в зависимости от опыта. много ли придется переделывать? Придется 
переделывать всю программу. Это говорит о том, что она неправильно 
спроектирована. Вот, как лучше сделать: 

Лучше сделать в классе Департамент поле-массив работников и соответственно 
класть в него нужное число объектов-работников. Так каждому работнику будет 
соответствовать один объект и мы можем хоть каждому индивидуально рассчитывать 
зарплату, добавлять любое число рангов и правил, меняя только класс Работник 
и не трогая весь остальной код. 

Далее. Для работников лучше сделать не 1, а 4 класса — свой для каждой профессии. При
этом, понятно что у них будет много общего. Чтобы показать что эти классы
связаны, и чтобы не копипастить ничего, надо применить тут наследование.

Наследование позволяет создавать класс не с нуля, а дополняя существующий. Мануал: 
http://p...content-available-to-author-only...p.net/manual/ru/language.oop5.inheritance.php

Естественно, базовый класс надо будет пометить как абстрактный: 
http://p...content-available-to-author-only...p.net/manual/ru/language.oop5.abstract.php

Если в мануале недостаточно понятно объяснено, задавай вопросы или почитай 
соответствующие главы в книге Зандстры (название в ОП-посте).

> $advert->maEmployees[0] = 15;

Этот код абсолютно непонятен. Чтобы сделать его понятным надо либо записать
его в виде $advert->addEmployees(15, 0) — в этом случае понятно станет из 
названий переменных — либо сделать как я написал выше, массив работников. В данной задаче 
подойдет второй вариант.

>  $result[0] = $obj->name;
0 ничего не говорит. Надо использовать понятные имена.

>  switch ($typeEmplCounter) {
>            case "1":
Это плохой код, так как "1" ничего не говорит. Что такое 1? Если тебе надо обозначать как-то
типы объектов, надо использовать константы ( http://p...content-available-to-author-only...p.net/manual/ru/language.oop5.constants.php ): 

case Employee.TYPE_MANAGER: ...

Сравни, насколько понятнее. 

Ну и в этой задаче switch исплоьзовать недопустимо, надо просто сделать 4 класса для разных 
профессий. При использовании switch код по мере развития быстро превращается в 
запутанную лапшу.

Кстати, у тебя не учитываются расходы на босса.

>  foreach ($value as $word)
>            $maxWidth = $maxWidth < (mb_strlen($word)) ? mb_strlen($word) : $maxWidth;
Можно написать в 1 строку с помощью max() и array_map(), попробуй.

Ну и мы изучаем ООП, потому таблицу логично бы сделать объектом — с методами добавитьСтроку(), нарисовать(), задатьВыравниваниеДляКолонки().

Если что-то непонятно из того, что я написал, уточняй. Все же это неплохая задача, 
сразу видно что человек понимает, а что нет.
