2010-11-14 2 views
0

Hello
Вот мой код .... Проблема в переменной $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

+3

Не нужно «объявлять» '$ product' перед циклом foreach; вы должны удалить строку '$ product =" "', поскольку она только путает вещи. – meagar

ответ

3

Вы столкнулись с очень хороший PHP WTF : foreach ($rowsProducts as &$product) делает $ product ссылкой. Не только для цикла, но forever. Если вы затем используете foreach, используя $ product в качестве переменной цикла позже (или делаете что-либо, записывая в $ product), он перезапишет последний элемент первого цикла foreach.

Просто используйте foreach ($rowsProducts as $key => $product) и назначьте $rowsProducts[$key] = $product; в конце вашего тела петли, если вы что-то изменили.

Другим решением будет вызов unset($product); после вашего первого цикла, чтобы избавиться от ссылки. Но, как правило, использование ссылочных контуров безопаснее, так как вы не можете забыть об отключении.

4

Вы должны сбросить $product после foreach цикла:

foreach ($rowsProducts as &$product) { 
     $product["features"] = &$productsFeatures[$product["product_id"]]; 
     $productsIDs[] = $product["product_id"]; 
} 
unset($product); 
Смежные вопросы