代码之家  ›  专栏  ›  技术社区  ›  GorillaApe

PHP变量范围混乱

  •  0
  • GorillaApe  · 技术社区  · 15 年前

    你好
    这是我的代码。。。。问题在于 $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 回复  |  直到 15 年前
        1
  •  3
  •   ThiefMaster    15 年前

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

    简单使用 foreach ($rowsProducts as $key => $product) 并分配 $rowsProducts[$key] = $product; 如果你改变了什么的话。

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

        2
  •  4
  •   codaddict    15 年前

    你应该不安 $product 之后 foreach 循环:

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