Делаю интернет-магазин контактных линз. Застрял на реализации функции добавления товара в корзину с РАЗЛИЧАЮЩИМИСЯ опциями, должно быть как тут (http://dostavim-linzi.ru/catalog/1DayAcuvueOasys)
Возникает проблема при добавлении одного и того же товара с разными опциями, данные и обновляются и при этом по новой пишутся.
Вот код из песочницы. Если скопировать, будет видно проблему сразу, сделал вывод инфы: что хочу добавить, куда и что на выходе, для наглядности.
Вижу, что проблема кроется внутри проверки условия "Если товар с таким ID есть в корзине", но понять не могу, как правильно написать условия для корректной работы скрипта.
// Массив с данными из корзины товаров
$prodsInCart = array(
// Опции левого глаза
'0' => array(
'id' => '1',
'count' => '1',
'diopters' => '-0.50',
'cur_rad' => '9.0'
),
// Опции правого глаза
'1' => array(
'id' => '1',
'count' => '2',
'diopters' => '+0.50',
'cur_rad' => '9.0'
)
);
// Генерация рандомного значения для занесения в массив с новыми данными
$rand = random_int(1, 10000);
$rand2 = random_int(1, 10000);
// ID Добавляемого товара
$id = 1;
// Параметры добавляемого товара
$options = array(
'0' => array(
'prod_qnty' => '1',
'diopters' => '+0.50',
'cur_rad' => '9.0',
),
'1' => array(
'prod_qnty' => '4',
'diopters' => '-0.50',
'cur_rad' => '9.0',
)
);
echo '<b>Что хочу добавить</b>';
echo "<pre>";
print_r($options);
echo "<br><br><br><div style='width: 50%;float:left;'>";
echo '<b>Вот сюда</b><br>';
print_r($prodsInCart);
echo '</div>';
// Массив с новыми опциями, в дальнейшем склеим с основным массивом
$optionsArr = array();
foreach ($prodsInCart as $key => $val) {
// Если товар с таким ID есть в корзине
if ($val['id'] == $id) {
// Ищем товар в массиве по опциями
if ($val['diopters'] == $options[0]['diopters'] && $val['cur_rad'] == $options[0]['cur_rad']) {
// Обновляем кол-во товаров для левого глаза
$prodsInCart[$key]['count'] += $options[0]['prod_qnty'];
}
else {
$optionsArr[$rand]['id'] = $id;
$optionsArr[$rand]['count'] = $options[0]['prod_qnty'];
$optionsArr[$rand]['diopters'] = $options[0]['diopters'];
$optionsArr[$rand]['cur_rad'] = $options[0]['cur_rad'];
}
if ($val['diopters'] == $options[1]['diopters'] && $val['cur_rad'] == $options[1]['cur_rad']) {
// Обновляем кол-во товаров для правого глаза
$prodsInCart[$key]['count'] += $options[1]['prod_qnty'];
}
else {
$optionsArr[$rand2]['id'] = $id;
$optionsArr[$rand2]['count'] = $options[1]['prod_qnty'];
$optionsArr[$rand2]['diopters'] = $options[1]['diopters'];
$optionsArr[$rand2]['cur_rad'] = $options[1]['cur_rad'];
}
}
// Если товара нет в корзине
else {
$optionsArr[$rand]['id'] = $id;
$optionsArr[$rand]['count'] = $options[0]['prod_qnty'];
$optionsArr[$rand]['diopters'] = $options[0]['diopters'];
$optionsArr[$rand]['cur_rad'] = $options[0]['cur_rad'];
$optionsArr[$rand2]['id'] = $id;
$optionsArr[$rand2]['count'] = $options[1]['prod_qnty'];
$optionsArr[$rand2]['diopters'] = $options[1]['diopters'];
$optionsArr[$rand2]['cur_rad'] = $options[1]['cur_rad'];
}
}
// Склеивание массивов
$prodsInCart = array_merge($prodsInCart, $optionsArr);
echo "<div style='width: 50%;float:left;'>";
echo '<b>На выходе</b><br>';
print_r($prodsInCart);
echo '</div>';
Если линзы подходят под любой глаз, то не нужно разделять поиск на левый и правый, а можно искать просто по радиусу и диоптриям. Т.е. у вас есть список того, что в корзине, проверяете по ид и параметрам, если они все совпадают, то добавляете.
<?php
// Массив с данными из корзины товаров
$prodsInCart = array(
// Опции левого глаза
'0' => array(
'id' => '1',
'count' => '1',
'diopters' => '-0.50',
'cur_rad' => '9.0'
),
// Опции правого глаза
'1' => array(
'id' => '1',
'count' => '2',
'diopters' => '+0.50',
'cur_rad' => '9.0'
)
);
// Генерация рандомного значения для занесения в массив с новыми данными
$rand = rand(10, 10000);
// ID Добавляемого товара
$id = 1;
// Параметры добавляемого товара
$options = array(
'0' => array(
'prod_qnty' => '1',
'diopters' => '+0.50',
'cur_rad' => '9.0',
),
'1' => array(
'prod_qnty' => '4',
'diopters' => '-0.50',
'cur_rad' => '9.0',
)
);
echo '<b>Что хочу добавить</b>';
echo "<pre>";
print_r($options);
echo "<br><br><br><div style='width: 50%;float:left;'>";
echo '<b>Вот сюда</b><br>';
print_r($prodsInCart);
echo '</div>';
// Массив с новыми опциями, в дальнейшем склеим с основным массивом
$optionsArr = array();
foreach( $options as $opt )
{
$exists = false;
foreach ( $prodsInCart as $key => $val )
{
if ($val['diopters'] == $opt['diopters']
&&
$val['cur_rad'] == $opt['cur_rad']
&&
$val['id'] == $id
)
{
// Обновляю кол-во товаров
$prodsInCart[$key]['count'] += $opt['prod_qnty'];
$exists = true;
break;
}
}
if ( ! $exists )
{
//добавляю новый
//die( "dd" );
$optionsArr[$rand]['id'] = $id;
$optionsArr[$rand]['count'] = $opt['prod_qnty'];
$optionsArr[$rand]['diopters'] = $opt['diopters'];
$optionsArr[$rand]['cur_rad'] = $opt['cur_rad'];
}
}
// Склеивание массивов
$prodsInCart = array_merge($prodsInCart, $optionsArr);
echo "<div style='width: 50%;float:left;'>";
echo '<b>На выходе</b><br>';
print_r($prodsInCart);
echo '</div>';
?>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Как на данном фреймворке можно реализовать вывод кода в определенной позицииТак делают в популярных CMS
Нужно было добавить несколько полей в аргумент функции проблема заключается в том что та часть которая не в массиве fields работает