2017-01-06 32 views
1

我下面的会话数组存储购物车的物品:PHP会话阵列添加元素,如果同一ID

的print_r($ _ SESSION [ '项目']):

Array 
(
    [0] => Array 
     (
      [p_name] => Product A 
      [p_price] => 13.90 
      [p_seller] => 2001 
     ) 

    [1] => Array 
     (
      [p_name] => Product B 
      [p_price] => 2.00 
      [p_seller] => 2002 
     ) 

    [2] => Array 
     (
      [p_name] => Product C 
      [p_price] => 1.20 
      [p_seller] => 2002 
     ) 

    [3] => Array 
     (
      [p_name] => Product D 
      [p_price] => 50.00 
      [p_seller] => 2001 
     ) 

) 

我有一个循环从DB调用额外的数据:

while($res = $shipment->fetch_object()){ 
    $seller_id = $res->seller; 
    $shipment_cost = $res->shipment_fee; 

    //array_push($_SESSION['items']['p_fee'], $shipment_cost); 
} 

让说,在一个循环中,我得到以下数据:

$ seller_id = 2001; $ shipment_cost = 5.00

$ seller_id = 2002; $ shipment_cost = 3.00

我要分配并用名称['p_fee']添加一个额外的元件到其相应的组['p_seller']

如果$ seller_id(2001)== [ 'p_seller'] ---> array_push($ _ SESSION ['items'] ['p_fee'],'5.00')}

if $ seller_id(2002)== ['p_seller'] ---> array_push($ _ SESSION ['items']] ['p_fee'],'3.00')}

可以做到这一点吗?

$_SESSION['items']最后可能包含如下内容:

Array 
(
    [0] => Array 
     (
      [p_name] => Product A 
      [p_price] => 13.90 
      [p_seller] => 2001 
      [p_fee] => 5.00 
     ) 

    [1] => Array 
     (
      [p_name] => Product B 
      [p_price] => 2.00 
      [p_seller] => 2002 
      [p_fee] => 3.00 
     ) 

    [2] => Array 
     (
      [p_name] => Product C 
      [p_price] => 1.20 
      [p_seller] => 2002 
      [p_fee] => 3.00 
     ) 

    [3] => Array 
     (
      [p_name] => Product D 
      [p_price] => 50.00 
      [p_seller] => 2001 
      [p_fee] => 5.00 
     ) 

) 
+0

这似乎是合乎逻辑的我修改2个查询我假设你正在运行从一个查询生成该数据。那么你不需要这样的小提琴 – RiggsFolly

回答

4

是的,可以。

您可以通过添加该值,同时从数据库中检索该值来实现。例如:

while($res = $shipment->fetch_object()){ 
    $seller_id = $res->seller; 
    $shipment_cost = $res->shipment_fee; 

    foreach ($_SESSION['items'] as $key => $item) { 
     if ($item['p_seller'] === $seller_id) { 
      $_SESSION['items'][$key]['p_fee'] = $shipment_cost; 
     } 
    } 
} 

一个更好的(更快)的方式是创建sellerId和成本之间的映射,并随后将其放在会议:

$costMapping = array(); 
while($res = $shipment->fetch_object()){ 
    $seller_id = $res->seller; 
    $shipment_cost = $res->shipment_fee; 

    $costMapping[$seller_id] = $shipment_cost; 
} 

foreach ($_SESSION['items'] as $key => $item) { 
    if (isset($costMapping[$item['p_seller']])) { 
     $_SESSION['items'][$key]['p_fee'] = $costMapping[$item['p_seller']]; 
    } 
} 

这样,你只需要2个循环,无论你有多少卖家。

2

是的这可能,你应该只做两个循环,首先收取费用,其次是将它们与物品相关联。

// Fill the fees first 
$fees = []; 
while($res = $shipment->fetch_object()){ 
    $seller_id = $res->seller; 
    $shipment_cost = $res->shipment_fee; 
    $fees[$seller_id] = $shipment_fee; 
} 

// Assign fees 
foreach ($_SESSION['items'] as &$item) { 
    $fee = $fees[$item['p_seller']] ?: 0; // <- fee will be 0 if not found ! 
    $item['p_fee'] = $fee; 
} 

希望这有助于:)