Перепутана область видимости PHP - PullRequest
0 голосов
/ 14 ноября 2010

Привет
Вот мой код .... Проблема в переменной $product.
Есть ли способ исправить это?
Она определяется два раза и вызывает перезапись

ОБНОВЛЕННАЯ ПРОБЛЕМА

   $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"];
}

Ответы [ 2 ]

4 голосов
/ 14 ноября 2010

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

foreach ($rowsProducts as &$product) {
      $product["features"] = &$productsFeatures[$product["product_id"]];
      $productsIDs[] = $product["product_id"];
}
unset($product);
3 голосов
/ 14 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...