Сравнение двух массивов в PHP

465
18 сентября 2017, 05:04

Делаю интернет-магазин контактных линз. Застрял на реализации функции добавления товара в корзину с РАЗЛИЧАЮЩИМИСЯ опциями, должно быть как тут (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>';
Answer 1

Если линзы подходят под любой глаз, то не нужно разделять поиск на левый и правый, а можно искать просто по радиусу и диоптриям. Т.е. у вас есть список того, что в корзине, проверяете по ид и параметрам, если они все совпадают, то добавляете.

    <?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>'; 
?>
READ ALSO
Yii2. Реализация модулей

Yii2. Реализация модулей

Как на данном фреймворке можно реализовать вывод кода в определенной позицииТак делают в популярных CMS

221
Не выводятся поля из массива fields

Не выводятся поля из массива fields

Нужно было добавить несколько полей в аргумент функции проблема заключается в том что та часть которая не в массиве fields работает

231
mysql запрос в Laravel (без ORM)

mysql запрос в Laravel (без ORM)

Вот нашел в документации

250