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

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

【问题讨论】:

    标签: php reference 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”。考虑一下: 中仍然会有两个值
    • @runish:这就是原始发布者试图完成的任务——破坏引用的内容。但是,您的示例是错误的。仍然会有两个数组索引,但数据会消失。
    • 只是内容不被破坏,只是作废。
    • 在将其从内存中取出方面,无效与销毁相同。我澄清了我的答案,因为我不清楚发帖人是否要求删除数组索引本身,或者只是数组值。
    • 感谢大家的想法。 (1) 我不希望它被取消。我希望它完全从数组中删除。这是唯一的解决方案吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 2012-09-11
      • 2014-03-25
      • 1970-01-01
      • 2015-08-08
      • 2012-11-17
      • 2011-05-23
      • 2014-07-18
      • 1970-01-01
      相关资源
      最近更新 更多