Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php变量在循环中复制奇怪的行为_Php - Fatal编程技术网

php变量在循环中复制奇怪的行为

php变量在循环中复制奇怪的行为,php,Php,你好。面临着这样一个问题: 我有一个变量,它在循环中被重置和重新填充。我将该变量作为属性分配给其他变量(如$item->subitems)。 例如,我将$item收集到一个$items数组中。 此变量的每个循环都会重新设置和填充,并包含不同的数据。 近似示例代码如下所示: <?php $seasons = array(1,2); $ltabs= array(1); $all = array(1,2,3,4,5,6,7,8,9,0); foreach ($ltabs as $

你好。面临着这样一个问题: 我有一个变量,它在循环中被重置和重新填充。我将该变量作为属性分配给其他变量(如$item->subitems)。 例如,我将$item收集到一个$items数组中。 此变量的每个循环都会重新设置和填充,并包含不同的数据。 近似示例代码如下所示:

<?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变量,我才能成功地击败它。但我想澄清一下,为什么会这样?。。 根据文章-垃圾收集器和php的“写时拷贝”应该在我重置这个$itemz数组时初始化,所以对我来说,这一切看起来都很不正常。
任何帮助都将不胜感激。

在php中,对象是通过引用复制的,因此在这一行:

$rtabs[$season] = $itm;
您没有将
$itm
对象的副本放置到数组中,而是复制对它的引用。以后更改原始对象时,
rtab
数组中的版本也会更改

如果你想单独复制,你需要这样做

$rtabs[$season] = clone $itm;

你的样品再现了错误吗?如果没有,请减少你的真实代码,直到你只剩下你所描述的代码。在这样做的过程中,99%的几率你会发现是什么导致了它,因为你没有仔细检查你自己的代码。不能投赞成票,但谢谢。解释得很好。标记为答案。没问题。很高兴我能帮忙。