2013-05-11 2 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 в этом подцикле. Но я хотел бы отказаться - почему это действует так? .. В соответствии с статьей this сборщик мусора и копирование на PHP-файл должны быть инициализированы, когда я сбросил этот массив $ itemz, так что мне все это выглядит совершенно нелогично. Любая помощь будет оценена по достоинству.

+0

Ваш образец воспроизводит ошибку? если нет, уменьшите реальный код до тех пор, пока у вас останется только код, который делает то, что вы описываете. В процессе этого 99% вероятность того, что вы обнаружите, что вызывает его, потому что вы не изучаете свой собственный код. –

ответ

2

В PHP, объекты копируются ссылки, так на этой линии:

$rtabs[$season] = $itm; 

вы не размещая копию $itm объекта в массиве - вы копируете ссылку на него. Когда вы позже меняете исходный объект, изменяется и версия в массиве rtabs.

Если вы хотите сделать отдельную копию, вам нужно сделать что-то вроде этого.

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

Невозможно проголосовать, но спасибо. Хорошо объяснил. отмеченный как ответ. –

+0

Нет проблем. Рад, что смог помочь. –

Смежные вопросы