Php 如何根据购物车中的产品以及与这些产品链接的配送选项从购物车中删除配送选项

Php 如何根据购物车中的产品以及与这些产品链接的配送选项从购物车中删除配送选项,php,arrays,logic,e-commerce,Php,Arrays,Logic,E Commerce,我有一个市场,卖家可以销售多种产品,并分别指定配送选项,以多对多关系将配送选项与产品联系起来 在购物车控制器中,我试图智能地删除运输选项,这样卖家就不会剩下太少的运输费用 作为一个例子,考虑一个有两个产品的购物车。卖方已为每个产品选择了一个装运选项: $products = array( array( 'id' => 1, 'name' => 'Lightweight widget', 'shipping_option_ids'

我有一个市场,卖家可以销售多种产品,并分别指定配送选项,以多对多关系将配送选项与产品联系起来

在购物车控制器中,我试图智能地删除运输选项,这样卖家就不会剩下太少的运输费用

作为一个例子,考虑一个有两个产品的购物车。卖方已为每个产品选择了一个装运选项:

$products = array(
    array(
        'id' => 1,
        'name' => 'Lightweight widget',
        'shipping_option_ids' => array(
            1
        )
    ),
    array(
        'id' => 2,
        'name' => 'Heavyweight widget',
        'shipping_option_ids' => array(
            2
        )
    )
);
以下是两种装运选项:

$shipping_options = array(
    array(
        'id' => 1,
        'name' => 'Cheap shipping option',
        'price' => 100
    ),
    array(
        'id' => 2,
        'name' => 'Expensive shipping option',
        'price' => 200
    )
);
因此,我们有两种产品,每种都与不同的运输选项相关联。使用昂贵的运输选项,两种产品可以在同一包装中运输

现在,我需要从shipping options数组中删除便宜的shipping选项。这将使客户只有一种运输选择——昂贵的选择

一般化 条件
  • 购物车中的两个或多个产品没有至少一个相同的装运选项

    行动
  • 删除所有配送选项,但与具有最昂贵配送选项的产品链接的选项除外


我用以下方法解决了这个问题:

// Prepare for removal procedure
foreach ($store['shipping_options'] as &$shipping_option)
{
    $shipping_option['removal_candidate'] = FALSE;
}
unset($shipping_option);

// Label shipping options that aren't linked to all products:
foreach ($products as $product)
{
    if (!in_array($shipping_option['id'], $product['shipping_option_ids']))
    {
        $shipping_option['removal_candidate'] = TRUE;
    }
}

$number_of_shipping_options = count($shipping_options);

// Loop through each shipping option:
for ($i = 0; $i < $number_of_shipping_options; $i++)
{
    $shipping_option_a = $shipping_options[$i];

    // Compare each shipping option with each of the other shipping options:
    foreach ($shipping_options as $key => $shipping_option_b)
    {
        // Compare different shipping options only:
        if ($shipping_option_a['id'] != $shipping_option_b['id'])
        {
            // Remove the shipping option with the lowest price:
            if ($shipping_option_a['price'] < $shipping_option_b['price'])
            {
                if ($shipping_option_a['removal_candidate'])
                {
                    unset($store['shipping_options'][$i]);
                    $shipping_options_removed = TRUE;
                    $number_of_shipping_options = count($store['shipping_options']);
                }
                elseif ($shipping_option_a['price'] > $shipping_option_b['price'])
                {
                    if ($shipping_option_b['removal_candidate'])
                    {
                        unset($store['shipping_options'][$key]);
                        $shipping_options_removed = TRUE;
                        $number_of_shipping_options = count($store['shipping_options']);
                    }
                }
            }
        }
    }
    // Refresh key numbers:
    $store['shipping_options'] = array_values($store['shipping_options']);
}
//准备删除程序
foreach($store['shipping\u options']as和$shipping\u option)
{
$shipping_option['removation_candidate']=FALSE;
}
未结算($shipping_选项);
//标记未链接到所有产品的装运选项:
foreach($products as$product)
{
if(!in_数组($shipping_option['id'],$product['shipping_option\u ids']))
{
$shipping_option['removation_candidate']=TRUE;
}
}
$number\u of_shipping\u options=计数($shipping\u options);
//循环查看每个装运选项:
对于($i=0;$i<$u装运选项的数量;$i++)
{
$shipping_option_a=$shipping_options[$i];
//将每个装运选项与其他装运选项进行比较:
foreach($key=>$shipping\u选项)
{
//仅比较不同的装运选项:
如果($shipping\u option\u a['id']!=$shipping\u option\u b['id']))
{
//删除具有最低价格的装运选项:
如果($shipping\u option\u a['price']<$shipping\u option\u b['price']))
{
if($shipping\u option\u a[“删除候选项])
{
未设置($store['shipping_options'][$i]);
$shipping\u options\u removed=TRUE;
$number_of_shipping_options=计数($store['shipping_options');
}
elseif($shipping\u option\u a['price']>$shipping\u option\u b['price']))
{
if($shipping_option_b[“删除候选项])
{
取消设置($store['shipping_options'][$key]);
$shipping\u options\u removed=TRUE;
$number_of_shipping_options=计数($store['shipping_options');
}
}
}
}
}
//刷新密钥编号:
$store['shipping_options']=数组_值($store['shipping_options']);
}

那么,您是否可以将多个配送选项链接到一个产品?“最昂贵的运输选择”是什么意思?它是产品所有装运选项的价格总和吗?