2

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

4

3 回答 3

4

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

有关这方面的更多信息,请参阅手册中的取消设置参考。基本上你想做以下事情(取自评论):

$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完成了这一点。

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

于 2009-12-30T00:12:46.307 回答
1

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

于 2009-12-30T00:14:53.540 回答
0

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

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

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]]);
}
于 2009-12-30T00:13:19.643 回答