2011-08-22 31 views
1

我正在嘗試構建一個包含點菜項目和一攬子交易組合的購物車項目的數組。我想從包裝中取出產品並將產品輸入到我的訂單表中。以下是我的。它會提取數據,但只會將內部數組(包產品)的最後一條記錄添加到外部數組。點菜項目很好。PHP從內部數組循環添加數組項目

$sql = "SELECT id, item_id, package 
     FROM cart WHERE user_id = $userId"; 
$result = dbQuery($sql); 

$arrCartContent = array(); 

while ($row = dbFetchAssoc($result)) { 
    if ($row['package'] == 1) { 

     // Add Product Credits to Company and Order 
     $arrProductData = fetchProductDataByPackage($row['item_id']); 

     $numItem = count($arrProductData);  
     if ($numItem > 0) {       
      for ($i = 0; $i < $numItem; $i++) { 
       extract($arrProductData[$i]); 

       $row['product_id'] = $product_id; 
       $row['description'] = $pack_product_name; 
      } 
     } 

    } else { 
     $itemDetails = fetchProductDetails($row['item_id']); 

     $row['product_id'] = $row['item_id']; 
     $row['description'] = $itemDetails['name']; 
    } 
    $arrCartContent[] = $row; 
} 

if(!empty($arrCartContent)) { 
    foreach ($arrCartContent as $cartData) { 

     $product_id = $cartData['product_id']; 
     $description = $cartData['description']; 

     $sqlInsert  = "INSERT INTO shop_order_x_product 
          (order_id, product_id, description) 
         VALUES 
          ($orderId, $product_id, '$description')"; 

     $resultInsert = dbQuery($sqlInsert) or die('Cannot add order products: ' . mysql_error()); 
    } 
} 
+0

不要使用'extract()'。這是令人難以忍受的懶惰編程,並使得接下來不可能的調試成爲可能。 –

回答

0

你混了一陣,你的一般做法是好的,也許精簡有點將使這一件輕而易舉的防止您覆蓋內循環$row變量:

$arrCartContent = array(); 

while ($row = dbFetchAssoc($result)) 
{ 
    if ($row['package'] == 1) 
    {  
     // Add Product Credits to Company and Order 
     $arrProductData = fetchProductDataByPackage($row['item_id']); 
     foreach($arrProductData as $productData) 
     { 
      $new = array(); 
      $new['product_id'] = $productData['product_id']; 
      $new['description'] = $productData['description']; 
      $arrCartContent[] = $new; 
     }  
    } 
    else 
    { 
     $itemDetails = fetchProductDetails($row['item_id']); 
     $new = array(); 
     $new['product_id'] = $row['item_id']; 
     $new['description'] = $itemDetails['name']; 
     $arrCartContent[] = $new; 
    } 
} 
+0

在我發送原始問題後,我看到了我的「$ arrCartContent []」省略,但內部數組的最後一條記錄正在重複。儘管如此,設置新陣列的過程很像魅力。 –

+0

基本規則是:不要在相同範圍內重用變量。變量很便宜,不需要重複使用它們:) – hakre

0

您正在用每次迭代覆蓋$ row數組元素。試試...

if ($row['package'] == 1) { 

    // Add Product Credits to Company and Order 
    $arrProductData = fetchProductDataByPackage($row['item_id']); 

    $numItem = count($arrProductData);  
    if ($numItem > 0) {       
     for ($i = 0; $i < $numItem; $i++) { 
      extract($arrProductData[$i]); 

      $row['product_id'] = $product_id; 
      $row['description'] = $pack_product_name; 
      $arrCartContent[] = $row; 
     } 
    } 

} else { 
    $itemDetails = fetchProductDetails($row['item_id']); 

    $row['product_id'] = $row['item_id']; 
    $row['description'] = $itemDetails['name']; 
    $arrCartContent[] = $row; 
}