2012-02-05 57 views
3
$arr = array('a' => 1, 'b' => 2); 

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

unset($xxx); 

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

所以取消設置只中斷參考...取消設置引用數組項

你知道的方式來取消引用數組中的元素?

是的,我知道我只能在上面的代碼中使用unset($arr['a']),但這隻有當我確切知道有多少物品有數組時,纔有可能,並且不幸的是我不知道。

這個問題是一種與this one(這就是爲什麼該解決方案不工作的原因)

+0

不能設置($ arr); ?? – Nalaka526 2012-02-05 02:34:28

回答

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]); 
+0

不錯的解決方案,但下面的代碼呢? $ arr = array('a'=> 1,'b'=> 2,'c'=> 1); $ xxx =&$ arr ['c']; 這就是爲什麼它不適用於我:( – 2012-07-13 02:57:54

1

當您取消設置引用,只是斷開了變量名和變量內容之間的綁定。這並不意味着變量內容將被破壞。

,並且相對於上面的代碼 - 我不認爲有需要在單獨的密鑰

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

答案很簡單:

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

$xxx = 'a'; 

unset($arr[$xxx]); 

print_r($arr); // gone :) 

即你可能永遠不會真正需要的。一個參考。只需將$xxx設置爲適當的鍵即可。