因此,我正在为我父亲的生意从事一个小项目。我已经完成了大部分工作,但仍然需要进行一些后端开发。我希望用户选择一些复选框,然后从选定的选项中看到固定价格(我已经完成了此操作),然后用户输入其值,然后乘以复选框提供的固定价格。 这是代码:
<?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;
}
答案 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
只要您可以只做出一次选择并且我猜对了输入数据,这将起作用。看起来选择可以是一个以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
使用array_count_values
的另一个小的效果是我们正在循环访问较少的数据。在上面的示例中,我们实际上只进行了1次迭代,而不是循环3次。最多最多可以完成$map
个数组迭代的次数。对于像这样的简单操作来说,性能提升不是很大,但是就在那里。
这两个都是更干净的实现,因为如果您需要在旧代码中添加一个选择,则需要添加另一个if
块和一堆代码。这样,您就可以创建另一个数据数组,如果需要的话,它恰好可以存储在数据库中。
我应该补充一下,我是“懒惰的”将所有数据转换为数组,因此您必须在其中添加其他3
左右。
-注意-我考虑过删除第一种方法,因为第二种方法更好,但是我将其保留,因为它显示了另一种执行相同基本操作的方法...
如果您想将定价数据保存在数据库中(我可能会这样做),则可以使用
制作表格 id | price | message
然后将数据存储在表中,并使用PDO
用fetchAll(PDO::FETCH_GROUP)
之类的方式将其拉出,以便获得ID作为键...等等...但这取决于您和问题的范围之外。我只是以为我会提到使用数组的优点。
无论如何,尽情享受吧!