取消设置 php 参考

Posted

技术标签:

【中文标题】取消设置 php 参考【英文标题】:unsetting php reference 【发布时间】:2010-12-30 23:12:24 【问题描述】:

所以我有这个函数,它返回一个对传入数组的特定点的引用。我想调用 unset,然后从数组/引用中删除结果,但调用 unset 只会删除引用,而不是原始数组中的数据。有什么想法吗?

【问题讨论】:

【参考方案1】:

请注意,unset on references 的行为是设计使然。您可以改为返回要删除的元素的索引,或者如果数组不平坦,则返回索引数组。

例如,您可以使用以下函数:

function delItem(&$array, $indices) 
    $tmp =& $array;
    for ($i=0; $i < count($indices)-1; ++$i) 
        $key = $indices[$i];
        if (isset($tmp[$key])) 
            $tmp =& $tmp[$key];
         else 
            return array_slice($indices, 0, $i+1);
        
    
    unset($tmp[$indices[$i]]);
    return False;

或者,如果您更喜欢例外,

function delItem(&$array, $indices) 
    $tmp =& $array;
    while (count($indices) > 1) 
        $i = array_shift($indices);
        if (isset($tmp[$i])) 
            $tmp =& $tmp[$i];
         else 
            throw new RangeException("Index '$i' doesn't exist in array.");
        
    
    unset($tmp[$indices[0]]);

【讨论】:

如果我得到一个索引数组(索引数组的大小为 n),我如何访问该值以取消设置?【参考方案2】:

将引用设置为null 将破坏引用(以及任何其他引用)链接到的数据。

有关更多信息,请参阅手册中的Unsetting References。基本上你想做以下事情(取自 cmets):

$a = 1;
$b =& $a;
$c =& $b;  //$a, $b, $c reference the same content '1'

$b = null; //All variables $a, $b or $c are unset

在你的情况下,它看起来像这样:

$a =& getArrayReference($whatever);
$a = null;

编辑

为了消除任何误解,以下是您在取消设置数组引用时得到的结果:

$arr = array('x','y','z');

$x =& $arr[1];
unset($x);
print_r($arr);
//gives Array ( [0] => x [1] => y [2] => z )

$x =& $arr[1];
$x = null;
print_r($arr);
//gives Array ( [0] => x [1] => [2] => z ) 

请注意第二个数组索引在第一个示例中没有删除它的内容unset(),但是设置对null 的引用的第二个示例完成了这一点。

注意:如果您还需要取消设置数组索引,我有点不清楚您是否这样做,那么您需要找到一种方法来引用数组的键而不是值,可能是通过更改函数的返回值。

【讨论】:

这不是真的。这只会将 $a、$b 和 $c 设置为“null”。考虑一下: php $a = array('foo', 'bar'); $b = &$a[0]; $b = 空; var_dump($a);数组 $a; 中仍然会有两个值 @runish:这就是原始发布者试图完成的任务——破坏引用的内容。但是,您的示例是错误的。仍然会有两个数组索引,但数据会消失。 只是内容不被破坏,只是作废。 在将其从内存中取出方面,无效与销毁相同。我澄清了我的答案,因为我不清楚发帖人是否要求删除数组索引本身,或者只是数组值。 感谢大家的想法。 (1) 我不希望它被取消。我希望它完全从数组中删除。这是唯一的解决方案吗?【参考方案3】:

取消设置引用不会取消设置被引用的变量是预期的行为。一种解决方案是返回键而不是值,并使用它来取消设置原始值。

【讨论】:

以上是关于取消设置 php 参考的主要内容,如果未能解决你的问题,请参考以下文章

每当我重新加载页面时,仍会设置取消设置 PHP 会话变量 [重复]

取消设置 php 会话变量

如何在 PHP 中取消设置 cookie?

php 取消设置BB UI菜单项。将其添加到子主题的functions.php文件中。 (2.0)取消设置BB UI菜单items.php

你需要取消设置PHP内存问题吗?

通过引用取消设置 PHP