我正在研究一个项目,该项目基本上将一些数据从一个表映射到另一个表。 我正在遍历产品列表,以找出我要翻译的语言。
我有以下代码:
foreach ($allLanguages AS $languageID => $language) {
foreach ($allProducts AS $singleProduct) {
if (in_array ($languageID, $productLanguages[$singleProduct->id])) {
$singleProduct->lang_id = $productId;
$singleProduct->language = $language['language'];
$singleProduct->country = $language['country'];
print $singleProduct->id . " - " .$language['language']."_".$language['country']."\n";
$languageProducts[] = $singleProduct;
$productId ++;
}
}
}
print "after loops: \n";
foreach ($languageProducts AS $product) {
print $product->id . " - " .$product->language."_".$product->country."\n";
}
它产生如下输出:
// put any code in {}
1 - de_DE
2 - de_DE
3 - de_DE
1 - de_AT
2 - de_AT
之后循环:
1 - de_AT
2 - de_AT
3 - de_DE
1 - de_AT
2 - de_AT
前五行(内部输出)是正确的(根据我的数据)并且是预期的。
但是,然后,这些值“神秘地”从循环内的正确值更改为外部的错误值。
看起来它们已被覆盖,但总行数仍然正确。仅存在于de_DE中的一条记录不变。
因此,我不得不猜测:这是一种按引用致电-问题吗? 有人可以指出我正确的方向吗? 提前非常感谢!
答案 0 :(得分:2)
如果将foreach
放在内部foreach($allProducts as $singleProduct) {
$singleProduct = clone $singleProduct;
// ...
}
循环中,则会看到您正在为每种语言使用相同的对象实例ID。
您将需要克隆对象以获得它的副本。
authorization
这将为您提供不会互相覆盖的对象的副本。