Как исправить вторую часть из кода? - PullRequest
0 голосов
/ 03 марта 2019

Так что я работаю над небольшим проектом для бизнеса моего отца.Я закончил с большей частью, но я все еще должен сделать некоторую внутреннюю разработку.Я хочу, чтобы пользователь установил некоторые флажки и затем увидел фиксированную цену из выбранного (я с этим покончил), затем пользователь вводит их значение, и оно умножается на фиксированную цену, указанную в флажках.Вот код:

<?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 голосов
/ 03 марта 2019

Вот более чистый подход, чем то, что вы делаете.

 //$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 - мы зациклились на меньшем количестве данных.В приведенном выше примере вместо 3-х циклов мы фактически делаем только 1 итерацию.Самое большее, вы бы сделали до подсчета итераций массива $map.Это не значительное повышение производительности для чего-то столь простого, но оно есть.

Обе эти реализации намного чище, потому что если вам нужно добавить выбор со старым кодом, который требовал добавления в другой if блок и куча кода.Таким образом, вы просто создаете другой массив данных, который может оказаться чем-то, что вы можете даже сохранить в базе данных, если хотите.

Я должен добавить, что я был «ленивым», чтобы преобразовать все ваши данные вмассив, так что вам придется добавить туда еще 3 или около того.

-Note- Я думал об удалении первого метода, так как второй лучше, но я оставлю его, поскольку он показывает другой способ сделать то же самое основное ...

Если вы хотите сохранить данные о ценах в БД (что я, вероятно, хотел бы сделать), вы должны создать таблицу с

 id | price | message

, а затем сохранить эти данные в таблице ивытащите его с помощью чего-то вроде PDO, используя fetchAll(PDO::FETCH_GROUP), чтобы вы получили идентификатор в качестве ключа ... и т. д. ... но это зависит от вас и выходит за рамки вопроса.Я просто подумал, что упомяну это как преимущество использования массива.

В любом случае, наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...