Сложение и вычитание в диапазоне чисел и зацикливание

Мне интересно, как я буду складывать и вычитать числа в заданном диапазоне и которые будут возвращаться к себе, пример ниже;

Диапазон: 1–10

Итак, если бы у меня было число 7 и я добавил к нему 5, я бы хотел, чтобы число стало 2.

8, 9, 10, по кругу до 1, 2.

И то же самое, если я вычел, значит, у меня есть число 3, и я вычитаю 4, поэтому у меня должно остаться 9.

2, 1, цикл до 10, 9

Я надеюсь в этом есть смысл.

Спасибо.


person Hairzo    schedule 05.04.2012    source источник


Ответы (6)


Вы можете использовать оператор %.

Вычисляет остаток после деления.

Например:

$d = 10;

$x = 7;

$y = 5;

echo ($x + $y) % $d;

дает 2;

С отрицательными значениями вы можете просто удалить МИНУС

person s.webbandit    schedule 05.04.2012
comment
Если я сделаю $r = 10; echo (2 - 5) % $r;, он вернет мне -3. Когда он станет ниже 1, мне нужно, чтобы он пошел к 10, а затем ушел оттуда, поэтому вышеприведенное должно вывести мне 7. - person Hairzo; 05.04.2012
comment
Используйте 1_ - person s.webbandit; 05.04.2012
comment
Спасибо, ваш кажется самым простым из всех. - person Hairzo; 05.04.2012

Используйте оператор модуля.

result = (a + b) % 10;
person Klas Lindbäck    schedule 05.04.2012

Вы можете использовать функцию по модулю, например (7+5)%10 = 2

person anuragsn7    schedule 05.04.2012

Попробуй это:

$range = range(1,10);
$min = min($range);
$max = max($range);

function operate( $a, $b, $operation ) {
    global $max, $min;

    switch( $operation ) {
        case '+':
            $a += $b;
            break;
        case '-':
            $a -= $b;
            break;
    }

    if( $a < $min ) {
        return $max + $a;
    } else if( $a > $max ) {
        return $a - $max;
    }
}

Надеюсь, поможет.

person web-nomad    schedule 05.04.2012
comment
Это, похоже, не сработало, оно просто сложило числа и дало мне неправильный номер. - person Hairzo; 05.04.2012

Вы можете сделать это с помощью кода, например

$range = array('from' => 3, 'to' => 13);
$dist = $range['to'] - $range['from'];
$a = 7;
$b = 14;

echo ($dist + ($a % $range['to'] - $b % $range['to'])) % $dist; // $a - $b
echo ($dist + ($a % $range['to'] + $b % $range['to'])) % $dist; // $a + $b
person user1303559    schedule 05.04.2012

Модуль добьется цели, как показали другие, но вы также должны учитывать нижний предел диапазона.

Например. зацикливание произвольного значения в диапазоне часов будет работать, поскольку оно отсчитывается от нуля. Но если вы хотите зациклить значение в диапазоне месяцев, у вас возникнут проблемы с последним днем, потому что:

31 % 31 = 0

Таким образом, вы вернетесь к нулю, когда должны оставаться на 31.

Чтобы разобраться с любым диапазоном, нужно сделать так:

$min = 5;
$max = 15;
$value = 25; // The range is 11, so we want this turned into 14

$range = $max - $min + 1;
$value = (($value-$min) % $range) + $min;

Чтобы иметь дело со значениями ниже минимума:

$range = $max - $min + 1;
$value = ($min - $value) % $range;
$value = $max - ($value - 1);
person sharkin    schedule 09.09.2012