Unset передается по ссылке, также сбрасывает исходное значение

Я хочу ссылку на массив, а затем сбросить ссылку на несколько элементов массива. На вопрос я упростил код:

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 (), так почему это вызывает проблемы?

Благодарю.

0

Решение

Разница в том, что вы на самом деле не отменяете ссылку. Вы отменяете значение в ссылочных данных. Смотрите эту песочницу: 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,
)
0

Другие решения

Создавая ссылку используя $return =& $this->dataвы в основном даете массив $this->data новое имя. Вот что такое ссылки. Теперь не имеет значения, обращаетесь ли вы к массиву, используя новое имя или старое имя.

1

По вопросам рекламы [email protected]