2010-11-14 111 views
0

你好
这是我的代码....问题是在$product变量。
有什么办法解决这个问题吗?
它被定义两次,导致问题覆盖PHP变量范围困惑

修订

$productsIDs = array(); 
     foreach ($rowsProducts as &$product) { 
      $product["features"] = &$productsFeatures[$product["product_id"]]; 
      $productsIDs[] = $product["product_id"]; 
     } 

//GET STOCK FEATURES 
$sqlIds=implode(",",$productsIDs); 
$sql="SELECT * FROM eshop_products_stock WHERE product_id IN ($sqlIds)"; 

$productsStock = $db->getRecordSet($sql); 
$sql="SELECT * FROM `eshop_features_valuestr` WHERE feature_id IN ". 
     "(SELECT DISTINCT feature1_id FROM eshop_products_stock WHERE product_id IN ($sqlIds))" . 
     " AND language_code='$lang'"; 

$productsSizes = $db->getRecordSet($sql); 
$sql="SELECT * FROM `eshop_features_valuestr` WHERE feature_id IN ". 
     "(SELECT DISTINCT feature2_id FROM eshop_products_stock WHERE product_id IN ($sqlIds))". 
     " AND language_code='$lang'";; 
$productsColors = $db->getRecordSet($sql); 

$productsSizesV=array(); 
foreach($productsSizes as $size) 
{ 
    $productsSizesV[$size["value"]]=$size["title"]; 
} 

$productsColorsV=array(); 
foreach($productsColors as $color) 
{ 
    $productsColorsV[$color["value"]]=$color["title"]; 
} 
//Group by product stock 
$productsStockV=array(); 
$product=""; 

foreach($productsStock as $product) 
{ 
    $productsStockV[$product["product_id"]]["sizes"][]=$product["feature1_value"]; 
    $productsStockV[$product["product_id"]]["colors"][]=$product["feature2_value"]; 
} 
+9

这是什么问题? – Gumbo 2010-11-14 18:36:13

+3

没有必要在'foreach'循环之前声明'$ product';你应该删除'$ product =“”'这行,因为它只是混淆了事情。 – meagar 2010-11-14 18:37:42

回答

3

你遇到了一个非常漂亮的PHP WTF : foreach ($rowsProducts as &$product)使产品成为参考。不仅为循环而且永远。如果以后使用$ product作为循环变量的foreach(或者写任何写入$ product的东西),它将覆盖第一个foreach循环的最后一项。

只要使用foreach ($rowsProducts as $key => $product)并在循环体的末尾分配$rowsProducts[$key] = $product;如果您更改了任何内容。

另一种解决方法是在第一次循环后调用unset($product);以摆脱引用。但通常不使用参考循环更安全,因为您不能忘记取消设置。

4

问题的方案foreach环后,应取消设置$product

foreach ($rowsProducts as &$product) { 
     $product["features"] = &$productsFeatures[$product["product_id"]]; 
     $productsIDs[] = $product["product_id"]; 
} 
unset($product);