Вот более чистый подход, чем то, что вы делаете.
//$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)
, чтобы вы получили идентификатор в качестве ключа ... и т. д. ... но это зависит от вас и выходит за рамки вопроса.Я просто подумал, что упомяну это как преимущество использования массива.
В любом случае, наслаждайтесь!