【问题标题】:PHP variable scope confusedPHP变量范围混淆
【发布时间】:2010-11-14 18:34:27
【问题描述】:

你好
这是我的代码....问题出在$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"];
}

【问题讨论】:

  • 问题出在哪里?
  • 没有必要在foreach循环之前“声明”$product;你应该删除$product=""这行,因为它只会让事情变得混乱。

标签: php variables scope


【解决方案1】:

您应该在foreach 循环之后取消设置$product

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

【讨论】:

    【解决方案2】:

    你遇到了一个非常棒的 php WTF: foreach ($rowsProducts as &$product) 使 $product 成为参考。不仅是循环,而是永远。如果您稍后使用将 $product 作为循环变量的 foreach(或对 $product 进行任何写入操作),它将覆盖第一个 foreach 循环的最后一项。

    如果您更改了任何内容,只需使用 foreach ($rowsProducts as $key => $product) 并在循环体末尾指定 $rowsProducts[$key] = $product;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2017-11-03
      • 2015-08-07
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多