2013-05-11 54 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