У меня есть две переменные:
$points - could be positive or negative
$time_elapsed -is always positive
Я пытаюсь пропорционально уменьшить $points
основанный на $time_elapsed
, Я не могу использовать вычитание, потому что оно не «пропорционально» так, как мне нужно. Мне нужно что-то похожее на деление, но это всегда уменьшает $ очков (деление увеличивает число, если оно отрицательное), так что я получаю следующий результат:
$points = -12;
$time_elapsed = 4;
$points/time_elapsed = -48;
$points = 12;
$time_elapsed = 4;
$points/time_elapsed = 3;
Я не могу использовать abs (), потому что он будет возвращать -3, когда баллы равны -12, когда мне действительно нужно, чтобы он возвращал -48 (мне всегда нужно что-то, что в $ time_elapsed раз меньше, чем $ points).
Я не могу использовать, если условия или что-нибудь подобное. Это вообще возможно?
Это будет работать Без условий!
function getPoints($points, $time_elapsed)
{
$is_positive = $points > 0;
$converters = [
true => function($points, $time_elapsed) {
return $points / $time_elapsed;
},
false => function($points, $time_elapsed) {
return $points * $time_elapsed;
}
];
return $converters[$is_positive]($points, $time_elapsed);
}
echo getPoints(-12, 4), PHP_EOL;
echo getPoints(12, 4), PHP_EOL;
Вы можете извлечь бит знака и использовать его, чтобы избежать условных операторов (хотя это ограничение — странная идея):
$sgn = ($points >> 31) & 1 //(for 32-bit variables)
return $points * $sgn * $time + $points * (1 - $sgn) / $time
//returns $points * $time for negative and $points / $time for positive