Я хочу ссылку на массив, а затем сбросить ссылку на несколько элементов массива. На вопрос я упростил код:
echo"1:";
print_r($this->data);
$return =& $this->data;
foreach(range(1,10) AS $key)
{
unset($return[$key]);
}
echo"2:";
print_r($this->data);
$ this-> data это массив. Этот код должен держать $ this-> data нетронутым, но это не так. Выход:
1:Array
(
[0] => Array
(
[id] => 1
)
[1] => Array
(
[id] => 2
)
[2] => Array
(
[id] => 3
)
[3] => Array
(
[id] => 4
)
[4] => Array
(
[id] => 5
)
[5] => Array
(
[id] => 6
)
[6] => Array
(
[id] => 7
)
[7] => Array
(
[id] => 8
)
[8] => Array
(
[id] => 9
)
[9] => Array
(
[id] => 10
)
)
2:Array
(
[0] => Array
(
[id] => 1
)
)
Почему при сбросе ссылки массив в $ this-> data изменяется? Все остальные вопросы в stackoverflow, касающиеся удаления ссылок, используют функцию unset (), так почему это вызывает проблемы?
Благодарю.
Разница в том, что вы на самом деле не отменяете ссылку. Вы отменяете значение в ссылочных данных. Смотрите эту песочницу: PHP Unset Test
$a=1;
$b = & $a;
unset($a);
echo 'B'."\n";
echo $b;
echo "\n\n";
$c=array(0,1,2,3);
$d = & $c;
unset($c);
echo 'D'."\n";
var_export($d);
echo "\n\n";
$e=array(0,1,2,3);
$f = & $e;
unset($f[2]);
echo 'E'."\n";
var_export($e);
Выход:
B
1
D
array (
0 => 0,
1 => 1,
2 => 2,
3 => 3,
)
E
array (
0 => 0,
1 => 1,
3 => 3,
)
Создавая ссылку используя $return =& $this->data
вы в основном даете массив $this->data
новое имя. Вот что такое ссылки. Теперь не имеет значения, обращаетесь ли вы к массиву, используя новое имя или старое имя.