所以我有这个函数,它返回一个对传入数组的特定点的引用。我想调用 unset ,然后从数组/引用中删除结果,但调用 unset 只会删除引用,不是原始数组中的数据。有什么想法吗?
问问题
1872 次
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
请注意,unset
on 引用的行为是设计使然。您可以改为返回要删除的元素的索引,或者如果数组不平坦,则返回索引数组。
例如,您可以使用以下函数:
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 回答