2014-10-07 72 views
0

我想要对数组的引用,然后取消对数组的几个元素的引用。对于这个问题,我已经简化的代码:未设置通过引用传递,也取消原始值

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不变,但它不会。输出是:

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->数据中的数组被改变?关于删除引用的所有其他问题在stackoverflow使用unset()函数,那么为什么这会给出问题?

谢谢。

+1

“我用我的左手指在什么时候,我不想丢掉我把我的右手手指点在同一的东西,扔掉那东西。“ – 2014-10-07 20:09:28

+0

取消设置参考通常不会改变原始数据,从我到处阅读的内容。 – 2014-10-08 13:21:58

+0

不同之处在于您并未真正取消参考。您在引用的数据中取消设置值。看到这个沙箱:[PHP Unset Test](http://sandbox.onlinephpfunctions.com/code/3799128b2507b59a2ef9e64bdbeae1e27b8e88ef) – TecBrat 2014-10-08 13:57:59

回答

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

谢谢,一定是它。没有解决这个问题,你可能知道吗? – 2014-10-08 14:32:42

+0

有无数的变通,每一个都有一个价格。你愿意支付什么价格?什么属性的引用是你愿意放弃作为回报能够删除引用中的数组元素而不影响原始数组? – Oswald 2014-10-09 22:33:01

1

通过使用$return =& $this->data创建参考,您基本上给阵列$this->data一个新的名称。这就是参考。现在,使用新名称还是旧名称访问数组并没有什么区别。

+0

+1这就是参考。 – TecBrat 2014-10-07 20:11:08

+0

是的,但现在我想通过使用unset()来取消引用的某些元素。在引用上使用unset()函数不应该改变原始数据,但它在我的例子中。 – 2014-10-08 13:20:59

+0

http://php.net/manual/en/language.references.unset.php“当您取消设置参考时,您只需打破变量名称和变量内容之间的绑定,这并不意味着变量内容将被破坏”当我解锁时,这不会发生在这里。 – 2014-10-08 13:29:54