Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2018, 09:03   #1
[FENIX]
 
Регистрация: 13.10.2010
Сообщений: 3
По умолчанию Неправильно работает рекурсивная функция

Всем привет. Ребят, есть вот такая задача:

Есть организация. У неё есть всякие подразделения (ID). У каждого подразделения есть баллы, которые рекурсивно подсчитываются функцией. Берётся сумма баллов для одного отдела, и делится на количество проголосовавших за этот отдел - обычное среднее арифметическое. Всё вроде бы просто.

Потом берутся эти средние арифметические, суммируются, и делятся на количество отделов - так мы получаем средний балл для "Родительского" отдела. Далее по такой же схеме берутся средние показатели "Родительских" отделов, суммируются, и сумма делится на количество этих "Родительских" отделов - так мы получаем среднюю оценку для всей организации. Вроде бы просто, Организаия -> Родительские отделы -> Отделы. 3 уровня всего. Но.

Например нужно для какого то отдела на самом нижнем уровне добавить произвольную оценку (балл), и пересчитать все остальные параметры. У меня это пока не получается. Помогите пожалуйста.

Пример (на скриншоте) :

Есть "родительский" отдел "Операционный департамент":
У него есть 6 подотделов. У отдела "Управление депозитарных операций (ID=169)" 3 голоса, каждый по 100 баллов, средняя оценка 100.

У каких то отделов вообще голосов нет - там нет баллов и количества голосов в скабках. У двух других отделов - Управление клиринга и Управление расчетов по 1 голосу, по 100 баллов, среднее значение у каждого из этих отделлов 100.

Далее расчитывается среднее значение для "Операционного департамента". Берется сумма баллов: 300 и делится на общее количество отделов, учитываются даже отделы, у которых нет голосов. Получаем: 300/6 = 50. Тут всё правильно считается.

Но если, например мне нужно к отделу "Управление депозитарных операций" - к баллам, которые были получены после голосования прибавить произвольный балл, например 70, то должно рассчитываться для этого отдела вот так: (100+100+100+70) / 4 = 92,5 и далее пересчитываться для головного отдела "Операционный департамент".


Вот функция, которая ведёт сам расчёт:

Код:
//Эта функция насчёта NPS. Её надо подправить так, чтобы NPS разделов и подразделов корректно считался с учетом табличных значений
function calcNPS($arr) {
 
    if (isset($arr['CHILDS']) && count($arr['CHILDS'])) {
        $nps_value_sum = 0;
        $points_count_sum = 0;
 
 
 
        foreach ($arr['CHILDS'] as &$child) {
 
            $child = calcNPS($child);
            $nps_value_sum += isset($child['NPS_VALUE'])? $child['NPS_VALUE']:0;
            $points_count_sum += isset($child['POINTS_COUNT'])? $child['POINTS_COUNT']:0;
 
 
            if($child['ID']=='169'){
                $nps_value_sum += isset($child['NPS_VALUE'])? $child['NPS_VALUE']:0;
                $nps_value_sum += 70;
                $points_count_sum+=1;
 
                $child['NPS_VALUE'] = $nps_value_sum / $points_count_sum;
                $child['POINTS_COUNT'] = $points_count_sum;
                $nps_value_sum = $nps_value_sum / $points_count_sum;
            }
 
 
 
        }
 
        $arr['NPS_VALUE'] = $nps_value_sum/count($arr['CHILDS']);
        $arr['POINTS_COUNT'] = $points_count_sum;
 
    }
    return $arr;
}
Но сейчас эта функция неправильно делает расчёт. Она считает как будто бы (100+100+70) / 4 т.е. 100 не берётся в сумму.
NPS_VALUE - это и есть итоговая оценка. POINTS_COUNT - количество, на которое делим для расчета среднего балла.

Без условия if($child['ID']=='169') функция нормально ведёт расчёт, но вот произвольный балл добавить тогда не получиться.

Помогите пожалуйста кто может.
Изображения
Тип файла: png 1.png (86.3 Кб, 123 просмотров)
[FENIX] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсивная функция AngelMarik Помощь студентам 1 24.05.2013 21:19
Неправильно работает функция округления числа Nomicos Помощь студентам 3 09.07.2012 16:23
Рекурсивная функция Trinity13 Помощь студентам 8 14.02.2010 18:44
Си++. Рекурсивная функция. Diamond2107 Помощь студентам 6 02.12.2009 19:48