【问题标题】:Price Calculator based on Quantity [closed]基于数量的价格计算器[关闭]
【发布时间】:2013-11-14 03:34:47
【问题描述】:

我正在尝试创建一个简单的脚本来添加到我的 html 网站。

我需要它根据用户输入的数量来计算价格。

例如,值 1-1000 将乘以 1.50 并显示,1001-5000 乘以 1.20 并显示,5001-10000 乘以 1 并显示,任何高于此值的数字都会显示错误消息,例如“必须低于 10000"。

我一直在尝试在 php 中执行此操作,但没有成功。

【问题讨论】:

  • 请向我们展示尝试的代码并包含预期结果。
  • 显示你尝试过的没有成功

标签: php calculator


【解决方案1】:

您可以使用if来检查保险库并显示计算值:

if($input <= 1000)
{
  echo $input * 1.5;
}
elseif($input <= 5000)
{
  echo $input * 1.2;
}
elseif($input <= 10000)
{
  echo $input;
}
else
{
  echo "Must be below 10000";
}

【讨论】:

    【解决方案2】:

    您可能会发现操作员开关非常有用 (Switch in PHP)。像这样的:

    ...
    switch ($quantity) {
        case (($quantity >= 1) && ($quantity <= 1000)):
            $multiplicator = 1.5;
            echo $quantity * $multiplicator;
            break;
        case (($quantity >= 1001) && ($quantity <= 5000)):
            $multiplicator = 1.2;
            echo $quantity * $multiplicator;
            break;
        case (($quantity >= 5001) && ($quantity <= 10000)):
            $multiplicator = 1.2;
            echo $quantity * $multiplicator;
            break;
        case ($quantity > 10000):
            echo 'Quantity must be less then 10000!';
            break;
    }
    ....
    

    已编辑:使用循环的另一个选项:

    ...
    $limits_array = array(
        0 => array(
            'min' => 1,
            'max' => 1000,
            'mul' => 1.5,
        ),
        1 => array(
            'min' => 1001,
            'max' => 5000,
            'mul' => 1.2,
        ),
        2 => array(
            'min' => 5001,
            'max' => 10000,
            'mul' => 1,
        ),
    );
    foreach ($limits_array as $limits)
        if (($quantity >= $limits['min']) && ($quantity <= $limits['max']) {
            echo $quantity * $limits['mul'];
            break;
        }
    if ($quantity > $limits['max'])
        echo 'Quantity must be less then 10000!';
    ...
    

    请注意,在 foreach 最后一个值元素($value 是它的通用名称,它是 $limits)之后仍然存储数组中的最后一项。看看括号。

    【讨论】:

    • 为什么?如果条件变为 100 会怎样? 100箱?难道不应该复制通用功能(IF 和 MULTIPLY)吗?
    • 好吧,因为它更容易解释,如果你是 php 新手。我认为这项任务在大学里是一种测试,用于了解或不了解条件运算符,而不是编写理想代码:) 顺便说一句,我认为这会比定义大量常量和循环更快,特别是如果你这样做一些字符串操作。
    • 您永远无法确定 :) 他甚至从未告诉过 PHP 是他想要的最终变体,只是他尝试使用 PHP :)) 顺便说一句。我看到了您对数组的编辑,这是@YuraSokolov 向我建议的。我很感兴趣,为什么您认为这些值中的大多数像 max 和 min (以及乘数,但我猜在进一步的逻辑扩展中可能会有所不同)不是常数 :) 我的意思是,你永远不会改变超过 $limits[' min'] 或 $limits['max'],为什么它应该是一个变量
    • 没错,这只是我的猜测。只是......这是一个学生问题,也是很常见的大学任务;)我在您发表评论后开始添加数组,而不是 Yuriy。至于常量......我相信它们对于存储真正有意义的东西非常有用,并将其存储在项目中,而不是单个文件中,而不是简单的任务中。我喜欢在那里存储 api-s 的 md5 和 sha1 键、一些语言常量等。在这个特定的键中,所有数字在我看来都不是一个常量,而只是一个要比较的值。一次。所以 - 它是最多的数组。
    • 我一直习惯于使用非静态值定义数组。我的意思是您在代码定义的数组中添加了每个键、每个子键和每个值常量(静态)。如果有动态的东西,我会使用数组,键或值来自早期定义的变量或常量,或者将动态数据推送到最近可以使用的数组中。与您所说的有意义的逻辑相同:) 但是当我三思而后行时,PHP 中没有其他原因,是吗?我的意思是在其他语言中有地图,这里不是吗? :)
    【解决方案3】:

    我建议不要在 IF 语句中定义每个条件,而是为每个阶段定义常量:

    <form action="" method="post">
        <input type="text" name="qnt" />
        <input type="submit" />
    </form>
    
    <?php
    
    define('MIN_STAGE', 1);
    define('MAX_STAGE', 3);
    define('STAGE_1_MIN', 0);
    define('STAGE_1_MAX', 1000);
    define('STAGE_1_MULTIPLIER', 1.50);
    define('STAGE_2_MIN', STAGE_1_MAX);
    define('STAGE_2_MAX', 5000);
    define('STAGE_2_MULTIPLIER', 1.20);
    define('STAGE_3_MIN', STAGE_2_MAX);
    define('STAGE_3_MAX', 10000);
    define('STAGE_3_MULTIPLIER', 1);
    
    for($i = MIN_STAGE; $i <= MAX_STAGE; $i++) {
        if ($_POST['qnt'] > constant("STAGE_".$i."_MIN") && $_POST['qnt'] <= constant("STAGE_".$i."_MAX")) {
            echo $_POST['qnt'] * constant("STAGE_".$i."_MULTIPLIER");
        }
        elseif ($_POST['qnt'] < constant("STAGE_".MIN_STAGE."_MIN") || $_POST['qnt'] > constant("STAGE_".MAX_STAGE."_MAX")) {
            die ('Must be between ' . constant("STAGE_".MIN_STAGE."_MIN") . ' AND ' . constant("STAGE_".MAX_STAGE."_MAX"));
        }
    }
    

    【讨论】:

    • 有趣地使用常量!我想我可能为此任务选择了一个数组 - 访问条目更容易一些。
    • 常量太多不太好。这个解决方案可以更好地代替你使用数组的常量。像这样:array('stage1'=>array('min'=>1,'max'=>1000,'multiplier'=>1.5));而这个数组上只是一个 foreach 循环。
    • 我在一个映射舞台属性的数组和常量之间,尽管构建像constant('something'.$var) 这样的常量不是我最喜欢的选择,但我认为这些条目中的每一个实际上都是一个常量
    • @YuraSokolov 我并不是说这是最好的解决方案,但我看到“常量太多不太好”,你能解释一下为什么吗?我对此感兴趣并进行了简单的谷歌搜索,引导我到:stackoverflow.com/questions/1249303/too-many-constants ...从答案中我看到没有太多常量的规则,如果它们封装了一些东西来构建逻辑。也许在这种情况下,我们可以摆脱 _MIN 常量并对其进行逻辑处理,但在我看来,这些值本身就是常量。
    • @RoyalBg,首先是:stackoverflow.com/a/7766545/2651326 并且带有许多“定义”的代码很难看。我更喜欢在静态类中插入常量,并以经典的 OOP 风格定义它们。
    【解决方案4】:

    如果你想在纯 php 中使用它 - 那不是很好。对于许多重新加载,但它是如何工作的(这是一个糟糕的代码,对于坏主意):

    <?php
    $price = 10;
    if(isset($_REQUEST['count']){
        $count = (int)$count;
        if($count > 10000){
            echo 'Must be below 10000';
        }
        elseif($count >= 1 && $count <= 1000){
            $price *= 1.2;
        }
        //Etc...
        $total = $price * $count;
    }
    

    在我看来,您应该尝试使用 JS(或更简单——使用 jQuery)来实现它。 首先,创建一个表单:

    <input type="text" id="count" />
    <input type="button" id="calculate" value="Calculate" />
    

    然后做这样的事情:

    $(function(){
        var price = 10;
        var multiplier = 1;
        $('#calculate').click(function(){
            var count = parseInt($('#count').val());
            if(count > 10000){
                alert('Must be below 10000');
                return;
            }
            else if(count >= 1 && count <= 1000){
                multiplier = 1.2;
            }
            alert('Current price is ' + price + ' * ' + multiplier + ' = ' + getActualPrice());
        });
    
        function getActualPrice(){
            return price * multiplier;
        }
    });
    

    Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多