Как сделать проверку на числа 2 через 2 и 3 через 3

vipTelnet

Постоялец
Регистрация
14 Янв 2013
Сообщения
143
Реакции
11
Всем привет.
Нужно в зависимости от того какой сейчас этап $client->stage
определять номер периода этого этапа, периодов всего 2, 1 и 2. Периоды постоянно чередуются т.е сначала 2 потом 1, потом опять 2 , потом 1 и т.д.
Первый этап период меняется каждый день
Второй этап период меняется каждые 2 дня, т.е первые 2 дня период 2 потом следующие 2 период 1
Третий период меняется каждые 3 дня.

Нужно это как то автоматизировать что бы убрать четкие условия типа
$arr = [1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30];
а вместо это типа что типа $d % 2 == 1
что б не вводить руками все эти условия
PHP:
function getPeriod($stage, $d){
        if($stage == 1){
            if($d % 2 == 1 ){
                return 2;
            }
            if($d % 2 == 0 ){
                return 1;
            }
        }
        if($stage == 2){
            $arr = [1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30];
            //получаем номер текущего периода
            if(in_array($d, $arr)){
                return 2;
            }
            $arr = [3,4,7,8,11,12,15,16,19,20,23,24,27,28,31,32];   
            if(in_array($d, $arr)){
                return 1;
            }
        }
        if($stage == 3){
            //получаем номер текущего периода
            $arr = [1,2,3,7,8,9,13,14,15,19,20,21,25,26,27,31,32,33];
            if(in_array($d, $arr)){
                return 2;
            }   
            $arr = [4,5,6,10,11,12,16,17,18,22,23,24,28,29,30];
            if(in_array($d, $arr)){
                return 1;
            }
        }
 
}

$stage = 3;
$d = 3;
echo getPeriod($stage, $d);
 
Последнее редактирование:
Всем привет.
Нужно в зависимости от того какой сейчас этап $client->stage
определять номер периода этого этапа, периодов всего 2, 1 и 2. Периоды постоянно чередуются т.е сначала 2 потом 1, потом опять 2 , потом 1 и т.д.
Первый этап период меняется каждый день
Второй этап период меняется каждые 2 дня, т.е первые 2 дня период 2 потом следующие 2 период 1
Третий период меняется каждые 3 дня.

Нужно это как то автоматизировать что бы убрать четкие условия типа
$arr = [1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30];
а вместо это типа что типа $d % 2 == 1
что б не вводить руками все эти условия
Можно через циклы с заведением промежуточной переменной. Возможно, существует еще более эффективное решение, но зато метод универсален для числовых рядов любой длины (вставляем вместо блока из двух if с массивами в предыдущем примере) .

PHP:
if ($stage==2){
    $answer=1;                  //предполагаем, что $d лежит во множестве {3;4;7;8;11;12...}
    for($i=1; $i<=30; $i=$i+4){ //выясняем, принадлежит ли $d множеству {1;2;5;6;9;10...}
        if($d==$i || $d==$i+1){
            $answer=2;          //если это так, меняем возвращаемое значение с 1 на 2 и валим из цикла и ветвления заодно, т.к. в else мы уже не попадем
            break;
        }
    }                           //если цикл прокатил до конца, а совпадений среди значений $i не было найдено, возвращаемая переменная так и остается равной 1
    return $answer;
}
else{                           //то же самое, но для множеств с шагом три через три
    $answer=1;
    for($i=1; $i<=33;$i=$i+6){
        if($d==$i || $d==$i+1 || $d==$i+2) {
            $answer=2;
            break;
        }
    }
    return $answer;
}
Таким способом:
данную задачу решить невозможно, т.к. ряды пересекаются по делителям (к примеру, числа с делителями 2 или 3 присутствуют в обоих для каждого $stage).
 
Последнее редактирование:
Назад
Сверху