2013-05-11 51 views
0

美好的一天。面對一個問題,看起來像這樣: 我有一個變量,在循環中重置並重新填充。我將該變量賦值給其他變量,因爲它的屬性(如$ item-> subitems)。例如,我將$ item收集到$ items的數組中。 每個循環這個變量都被重新設置和重新填充,並且包含不同的數據。 近似示例代碼低於:PHP變量複製循環奇怪行爲

<?php 
$seasons = array(1,2); 
$ltabs= array(1); 
$all = array(1,2,3,4,5,6,7,8,9,0); 
     foreach ($ltabs as $tab) 
     { 
      //Resetting an object instance 
      $itm=false; 
      //Re-Initing object 
      if (1==1) 
      { 
       $itm->height = 1; 
       $itm->width = 2; 
      } 
      else 
      { 
       $itm->height = 3; 
       $itm->width = 4; 
      } 
      //And thats where crap happens 
      //foreach($seasons as $season) //Dont work that way too 
      for ($y=0;$y<count($seasons);$y++) 
      { 
       //Re-initing local array for needed values 
       $itemz=array(); 
       //$itm->items = array(); 
       for($a=0;$a < count($all);$a++) { 
        if ($all[$a] % $seasons)//Not tested, supposed to gove ANY dofference in arrays. 
        { 
         $itemz[]=$all[$a]; 
        } 
       } 
       $itm->items = $itemz; 
       $rtabs[$season] = $itm; 
       unset($itemz); 
       //unset($itemz); 
      } 
     } 
     //Returns crap. 
     var_dump($rtabs); 
?> 

但是,當我嘗試

<?php 
foreach($rtabs as $itm) 
{ 
    var_dump($itm->items); 
} 
?> 

我看到所有這些子項包含相同的一組數據。 我已經成功地通過在這個子循環中重新分配整個$ itm變量來打敗它。但我想undeerstand - 爲什麼這樣做? 根據this文章 - 垃圾收集器和PHP的寫時複製的事情應該初始化,當我重新設置這個$ itemz數組,所以對我所有這看起來很不起眼。 任何幫助,將不勝感激。

+0

您的示例重現了錯誤嗎?如果沒有,請減少真實的代碼,直到你只剩下讓你描述的事情發生的代碼。在這樣做的過程中,有99%的機會會發現是什麼導致了它,因爲你沒有仔細檢查自己的代碼。 – 2013-05-11 23:45:25

回答

2

在PHP中,對象是通過引用複製的,所以在這條線:

$rtabs[$season] = $itm; 

你不放置$itm對象的副本到您的陣列 - 你複製到它的參考。稍後更改原始對象時,rtabs陣列中的版本也會發生更改。

如果你想做一個單獨的副本,你需要做這樣的事情。

$rtabs[$season] = clone $itm; 
+0

不能投票,但謝謝。解釋得很好。標記爲答案。 – 2013-05-12 00:48:53

+0

沒問題。很高興我能幫上忙。 – 2013-05-12 01:07:19