2011-08-20 83 views
9

如何從給定密鑰的多維數組中刪除元素?從基於密鑰的多維數組中刪除元素

我希望這是貪婪的,以便它刪除數組中所有匹配我傳入的鍵的元素。我到目前爲止可以遍歷多維數組,但是我無法取消設置關鍵我需要,因爲我沒有參考它!

function traverseArray($array, $keys) 
{ 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value); 

     } else { 

      if(in_array($key, $keys)) 
      {      
       //unset(what goes here?) 

      } 

     } 
    } 

} 
+0

我認爲'呼叫時間傳遞參考已被棄用'。特別是因爲我在Code-igniter的一個類中使用了它。 – Abs

回答

8

下面的代碼工作(和不使用過時的東西),只是測試它:

function traverseArray(&$array, $keys) { 
    foreach ($array as $key => &$value) { 
    if (is_array($value)) { 
     traverseArray($value, $keys); 
    } else { 
     if (in_array($key, $keys)){ 
     unset($array[$key]); 
     } 
    } 
    } 
} 
+0

這非常有用,謝謝@Marian。如果任何人使用這個,並且想要執行一個你正在刪除的元素的VALUE檢查,你可以在執行'unset()'之前檢查'$ value'; – Jimbo

0

你可以做到這一點

unset($array[$key]); 

因爲$array不會是原來的數組的副本,只是對它的引用,所以任何修改將舉行。

此外,您的代碼段中存在一個小錯誤:當您進行遞歸調用時,您忘記了傳遞參數$keys

+1

只有當你通過引用傳遞...這是不是默認的afaik ... – sg3s

+0

@ sg3s在新版本(php5.x,不知道肯定)這是默認+傳遞引用' $ var'已被棄用。看到這個答案(http://stackoverflow.com/questions/6138454/php-arrays-and-pass-by-reference)澄清。 –

+0

我很確定@ sg3的權利。函數調用中的'&',例如'foo(&$a);'已根據手冊棄用,否則它表示'函數foo(&$ var){'。 – joakimdahlstrom

1

您可以通過參考使用通行證,聲明你的函數是這樣的:

function traverseArray(&$array, $keys) 
{ 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value, $keys); 
     }else{ 
      if(in_array($key, $keys)){ 
       unset($array[$key]); 
      } 
     } 
    } 
} 

那麼你可以取消設置鍵,它會從原來傳遞的值消失過,因爲在功能上$array只是一個指針到你傳遞的數組,以便它更新該數組。

unset($array[$key]); 

欲瞭解更多信息,請檢查php documentation on passing by reference

+0

我收到此消息'Call-time pass-by-引用已被棄用'。我在Codeigniter的一個類中使用了這個。 – Abs

+0

我編輯了我的答案以包含你的整個函數。此外,你需要確保在你調用它時使用'traverseArray($ array,$ keys)''和** not **'traverseArray(&$ array,$ keys)' – sg3s

+0

對,我再也沒有遇到這個錯誤,但是這個數組與之前一樣,我想知道這真的可以在類中起作用嗎?我從類中的另一個函數調用上述函數,並且此函數不返回任何內容。我調用它的方式如下所示:'$ this-> traverseArray($ errors,array('e1','e2') );' – Abs

0

,不要忘記修改的foreach:

foreach($array as $key=>&$value) 
+0

一旦引用了一個變量,就不需要這樣做,它會將其傳遞給變量afaik的所有用途(某人覺得要測試它?:p) – sg3s

+0

您不能在foreach中更改數組值。 –

+0

downvoting的原因是什麼? –