2013-03-12 121 views
0

当我使用PHP来操纵数组时,我遇到了一个问题!通过引用传递失败?

这是如何工作的?

我想知道为什么!

而我发现如果我不使用'未设置',这段代码可以工作!而我谷歌,但没有得到答案! 所以我问!

当我在PHP中使用Passing by Reference时,它失败了!

谢谢!

<?php 

$arr = array('a','b','c','d',array(1,2,3,4,5)); 

var_dump($arr); 
foreach($arr as &$value){ 
    if($value == 'c'){ 
     unset($value); 
    } 
    if(is_array($value)){ 
     foreach ($value as $key => &$v) { 
      if($v == 2){ 
       unset($v); 
      } 
     } 
    } 
} 
var_dump($arr); 

?> 

这是结果:

array (size=5) 
    0 => string 'a' (length=1) 
    1 => string 'b' (length=1) 
    2 => string 'c' (length=1) 
    3 => string 'd' (length=1) 
    4 => 
    array (size=5) 
     0 => int 1 
     1 => int 2 
     2 => int 3 
     3 => int 4 
     4 => int 5 
array (size=5) 
    0 => string 'a' (length=1) 
    1 => string 'b' (length=1) 
    2 => string 'c' (length=1) 
    3 => string 'd' (length=1) 
    4 => & 
    array (size=5) 
     0 => int 1 
     1 => int 2 
     2 => int 3 
     3 => int 4 
     4 => &int 5 
+0

什么是“失败”?该代码在语法上是正确的 – zerkms 2013-03-12 00:46:39

+0

nope。他正试图解除虚拟变量。您必须通过键名来取消实际的数组设置。 – 2013-03-12 00:48:04

+0

我想它在语法上是正确的。我的错。只是不正​​确。 – 2013-03-12 00:49:23

回答

4

如果你想删除数组中的项目你迭代 - 你需要unset阵列的关键,而不是它的价值:

foreach($arr as $key => $value){ 
    if (...) { 
     unset($arr[$key]); 
    } 
} 

您当前的解决方案无法按预期工作,因为&$value在任何特定迭代上都是对存储在$arr中的同一个变量的另一个引用。所以你是不是本地变量,而不是原来的。

+0

感谢您的帮助!我不明白通过参考传递!对不起! – suuuch 2013-03-12 01:09:33