取消设置引用的数组项

时间:2012-02-05 02:16:04

标签: php arrays

$arr = array('a' => 1, 'b' => 2);

$xxx = &$arr['a'];

unset($xxx);

print_r($arr);  // still there :(

所以未设置只会破坏引用...

您是否知道在引用的数组中取消设置元素的方法?

是的,我知道我可以在上面的代码中使用unset($arr['a']),但这只有在我确切知道阵列有多少项时才有可能,不幸的是我没有。

这个问题与this one有关(这就是解决方案不起作用的原因)

3 个答案:

答案 0 :(得分:2)

我可能错了,但我认为在数组中取消设置元素的唯一方法是查找与您拥有的变量引用的值匹配的索引,然后取消设置该元素。

 $arr = array('a' => 1, 'b' => 2);
 $xxx = &$arr['a'];

 $keyToUnset = null;
 foreach($arr as $key => $value)
 {
      if($value === $xxx)
      {
          $keyToUnset = $key;
          break;
      }
 }
 if($keyToUnset !== null)
     unset($arr[$keyToUnset]);
 $unset($xxx);

嗯,无论如何,沿着这些方向的东西。但是,请记住,这不是超级高效的,因为每次需要取消设置元素时,都必须遍历整个数组来查找它。

假设您可以控制如何使用$ xxx,您可能需要考虑使用它来保存数组中的键,而不是对键处元素的引用。这样,当您想要取消设置元素时,您不需要搜索数组。但您必须使用数组取消引用替换所有使用$ xxx的网站:

$arr = array('a' => 1, 'b' => 2);
$xxx = 'a';

// instead of $xxx, use:
$arr[$xxx];

// to unset, simply
unset($arr[$xxx]);

答案 1 :(得分:1)

取消设置引用时,只需断开变量名和变量内容之间的绑定即可。这并不意味着可变内容将被销毁。

关于上面的代码 - 我认为不需要单独的密钥

foreach($arr as $key => $value)
{
      if($value === $xxx)
      {
          unset($arr[$key]);
          break;
      }
 }

答案 2 :(得分:0)

简单的答案:

$arr = array('a' => 1, 'b' => 2);

$xxx = 'a';

unset($arr[$xxx]);

print_r($arr);  // gone :)

即..你可能从未真正需要参考。只需将$xxx设置为相应的密钥。