杂项价值变更-以引用方式致电?

时间:2019-03-12 12:04:21

标签: php

我正在研究一个项目,该项目基本上将一些数据从一个表映射到另一个表。 我正在遍历产品列表,以找出我要翻译的语言。

我有以下代码:

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中的一条记录不变。

因此,我不得不猜测:这是一种按引用致电-问题吗? 有人可以指出我正确的方向吗? 提前非常感谢!

1 个答案:

答案 0 :(得分:2)

如果将foreach放在内部foreach($allProducts as $singleProduct) { $singleProduct = clone $singleProduct; // ... } 循环中,则会看到您正在为每种语言使用相同的对象实例ID。

您将需要克隆对象以获得它的副本。

authorization

这将为您提供不会互相覆盖的对象的副本。