取消设置 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 取消设置BB UI菜单项。将其添加到子主题的functions.php文件中。 (2.0)取消设置BB UI菜单items.php