如何从代码中修复第二部分?

时间:2019-03-03 08:46:05

标签: php html web

因此,我正在为我父亲的生意从事一个小项目。我已经完成了大部分工作,但仍然需要进行一些后端开发。我希望用户选择一些复选框,然后从选定的选项中看到固定价格(我已经完成了此操作),然后用户输入其值,然后乘以复选框提供的固定价格。 这是代码:

<?php
//first part             
if(isset( $_GET["choice"] )){             
  $food = $_GET["choice"];             
  $c = count($food);             
  $price = 0.0;                           
  for($i=0;$i<$c;$i++){                 
    if($food[$i] == 1){                     
       $price = $price + 10;                     
       echo "Вие избрахте:<br>";                     
       echo "Лепене на гипсокартон<br>";                 
    }                 
    if($food[$i] == 2){                     
       $price = $price + 12;                     
       echo "Предстенна обшивка 1 пласт<br>";                 
    }                 
    if($food[$i] == 3){                     
       $price = $price + 16;                     
       echo "Предстенна обшивка 2 пласта<br>";                 
    }                 
    if($food[$i] == 4){                     
       $price = $price + 18;                     
       echo "Преградна стена с вата<br>";                 
    }                 
    if($food[$i] == 5){                     
       $price = $price + 2;                     
       echo "Редене на минерална и каменна вата<br>";                 
    }             
  }            
  echo "<br>Общо за 1 кв/м: " .$price. "лв.<br>";             
}            
else{                 
   echo 'Моля изберете нещо!';             
}  
//second part           
echo "Въведете вашата квадратура     <input type='text'name='finalprice'method='get'>";
echo "<input type='submit' valu='Изчисли'>"             
$finalprice = $_GET["finalprice"];             
if($finalprice[$i]>= 1){                 
   $finalprice = $finalprice * $price;                 
   echo "За вашата квадратура: " .$finalprice;             
}

1 个答案:

答案 0 :(得分:3)

这是一种比您正在做的事情更清洁的方法。

 //$choice = isset($_GET['choice']) && is_array($_GET['choice']) ? $_GET['choice'] : [];   
$choice = [2];

$map =  [
    1 => [               
       'price' => 10,                    
       'message' => "Вие избрахте:<br>Лепене на гипсокартон<br>",                
    ], 2 => [                             
       'price' => 12,                   
       'message' => "Предстенна обшивка 1 пласт<br>",                 
    ]
    //...
];

$food = array_intersect_key($map, array_flip($choice));  //choice is [2 => 0] after fliping

print_r($food);
$price = 0.0; 
foreach($food as $f){
    $price +=  $f['price']; 
    echo $f['message']."\n";
}

echo 'Price: '.$price;

输出

Array
(
    [2] => Array
        (
            [price] => 12
            [message] => Предстенна обшивка 1 пласт<br>
        )

)
Предстенна обшивка 1 пласт<br>
Price: 12

Sandbox

只要您可以只做出一次选择并且我猜对了输入数据,这将起作用。看起来选择可以是一个以1-5作为值的数组,但是我不知道您是否可以有重复的值。如果是这样,array_flip将删除它们,因此我们不能使用它或array_intersect_key。如果是这种情况,我们也许可以使用array_count_values

更新

这是将处理重复选择的修改:

我以前从未用过array_count_values这样的方法,但是它在我的脑海中恰到好处。所以我想我也将其发布。

 //$choice = isset($_GET['choice']) && is_array($_GET['choice']) ? $_GET['choice'] : [];        
$choice = [2,2,2];

$map =  [
    1 => [               
       'price' => 10,                    
       'message' => "Вие избрахте:<br>Лепене на гипсокартон<br>",                
    ],2 => [                             
       'price' => 12,                   
       'message' => "Предстенна обшивка 1 пласт<br>",                 
    ]
];

//we need to modify this for later use (multiplication)
$choice = array_count_values($choice);  //changes to [2 => 3] or [value => number of]
//so we get the same effect as array_flip, changing the value to the key
//we need it the key so we can match it to $map's Key
//- but with this we know how many times that item was checked

$food = array_intersect_key($map, $choice); 

print_r($food);
$price = 0.0; 
foreach($food as $k=>$f){
    $price +=  ($f['price'] * $choice[$k]); 
    echo $f['message']."\n";
}

echo 'Price: '.$price;

输出

Array
(
    [2] => Array
        (
            [price] => 12
            [message] => Предстенна обшивка 1 пласт<br>
        )

)
Предстенна обшивка 1 пласт<br>
Price: 36  #here we have 3 that are 12 each so we expect 36

Sandbox

使用array_count_values的另一个小的效果是我们正在循环访问较少的数据。在上面的示例中,我们实际上只进行了1次迭代,而不是循环3次。最多最多可以完成$map个数组迭代的次数。对于像这样的简单操作来说,性能提升不是很大,但是就在那里。

这两个都是更干净的实现,因为如果您需要在旧代码中添加一个选择,则需要添加另一个if块和一堆代码。这样,您就可以创建另一个数据数组,如果需要的话,它恰好可以存储在数据库中。

我应该补充一下,我是“懒惰的”将所有数据转换为数组,因此您必须在其中添加其他3左右。

-注意-我考虑过删除第一种方法,因为第二种方法更好,但是我将其保留,因为它显示了另一种执行相同基本操作的方法...

如果您想将定价数据保存在数据库中(我可能会这样做),则可以使用

制作表格
 id | price | message

然后将数据存储在表中,并使用PDOfetchAll(PDO::FETCH_GROUP)之类的方式将其拉出,以便获得ID作为键...等等...但这取决于您和问题的范围之外。我只是以为我会提到使用数组的优点。

无论如何,尽情享受吧!