Использование ceil для получения индекса массива PHP - PullRequest
1 голос
/ 19 декабря 2011

Я пытаюсь упростить некоторый унаследованный код PHP, который присваивает значение одной переменной на основе значения в другой переменной, примерно так:

if x < 50, y = 10
else if x >= 50 and < 100, y = 20
else if x >= 100 and < 350, y = 30
else y = 40

Фактический PHP-код для этого занимает несколько строк и далек от идеала, но в нем достаточно паттерна, который, я думаю, я могу значительно упростить, - но это не совсем простой паттерн.

Моя лучшая идея на данный момент - присвоить массиву возможные значения y, а затем вызвать индекс этого массива на основе предела значения x, например:

$convert = array (10, 20, 30, 30, 30, 30);
$y = ($x <= 350) ? $convert[ceil($x/50)] : 40;

Две линии, намного меньше избыточности и намного больше гибкости. Но я вижу, что ceil возвращает число с плавающей запятой, поэтому я не уверен, могу ли я доверять ему в создании индекса массива, и я не нашел в Интернете ничего об этом в любом случае. Если он может вернуть какое-то значение 3.000000000001, могу ли я просто сделать это так:

$y = ($x <= 350) ? $convert[round(ceil($x/50))] : 40;

Или все еще есть потенциальные ловушки и / или лучшее решение?

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Обратите внимание, что ваш код

if x < 50, y = 10
else if x >= 50 and < 100, y = 20
else if x >= 100 and < 350, y = 30
else y = 40

может быть упрощен

<?php
if ($x < 50) { $y = 10; }
else if ($x < 100) { $y = 20; }
else if ($x < 350) { $y = 30; }
else { $y = 40; }

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

1 голос
/ 19 декабря 2011

ceil() никогда не вернет ничего, кроме Integer в качестве документации (даже если он приведен как float), и Дейв указал.

Также из-за Type Juggling , он будет приведен как целое число, когда вы используете его там, где ожидается целое число.Вы должны быть на 100% в безопасности.Весь смысл в ceil - округлить до ближайшего целого числа: -)

...