2010-11-14 3 views
0

Bonjour
Voici mon code .... Le problème est à $product variable.
Y at-il un moyen de résoudre ce problème?
Il est défini deux fois et provoque problème remplace PHP variable scope confused

PROBLÈME MISE À JOUR

$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

Et quel est le problème? – Gumbo

+3

Il n'est pas nécessaire de "déclarer" '$ product' avant la boucle' foreach'; vous devez supprimer la ligne '$ product =" "' car cela ne fait que créer des confusions. – meagar

Répondre

3

Vous avez rencontré un très joli php WTF : foreach ($rowsProducts as &$product) fait de $ product une référence. Non seulement pour la boucle mais pour toujours. Si vous utilisez ensuite un foreach en utilisant $ product comme variable de boucle plus tard (ou faites quoi que ce soit en écrivant $ product), il écrasera le dernier élément de la première boucle foreach.

Utilisez simplement foreach ($rowsProducts as $key => $product) et affectez $rowsProducts[$key] = $product; à la fin de votre corps de boucle si vous avez modifié quelque chose.

Une autre solution serait d'appeler unset($product); après votre première boucle pour se débarrasser de la référence. Mais généralement, ne pas utiliser les boucles de référence est plus sûr car vous ne pouvez pas oublier de les désactiver.

4

Vous devez désinitialiser $product après la boucle foreach:

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