2012-02-05 70 views
2
array_walk_recursive($arr, function(&$val, $key){ 
    if($val == 'smth'){ 
     unset($val);   // <- not working, unset($key) doesn't either 
     $var = null;   // <- setting it to null works 
    } 
    }); 

    print_r($arr); 

我不希望它爲空,我希望元素完全脫離數組。這甚至可能與array_walk_recursive?unset inside array_walk_recursive not working

+0

的可能重複的[PHP:用未固化的元素的陣列\ _walk \ _recursive'](http://stackoverflow.com/questions/6235901/php-unset-elements- with-array-walk-recursive) – Gajus 2014-03-07 21:17:01

回答

6

此處不能使用array_walk_recursive,但可以編寫自己的功能。這很容易:

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

與用法:

array_unset_recursive($arr, 'smth'); 

或刪除幾個值:

array_unset_recursive($arr, array('smth', 51)); 
+0

適合我,謝謝! – themarkappleby 2013-01-14 19:36:29

4

unset($val)只會刪除當地的$val變量。

如何從array_walk_recursive內的數組中刪除元素沒有(理智)的方式。您可能必須編寫自定義遞歸函數才能這樣做。

+0

我想到了,但如果數組超過2個級別呢? – JohnSmith 2012-02-05 16:18:50

+0

@JohnSmith剛剛注意到:( – NikiC 2012-02-05 16:19:08

0

@dfsq的答案是正確的,但這個功能不會刪除空數組。所以你最終可能會得到Tree of empty array,這在大多數情況下並不是預期的。 我來代替本變形功能:

public function array_unset_recursive(&$array, $remove) { 
    foreach ($array as $key => &$value) { 
     if (is_array($value)) { 
      $arraySize = $this->array_unset_recursive($value, $remove); 
      if (!$arraySize) { 
       unset($array[$key]); 
      } 
     } else if (in_array($key, $remove, true)){ 
      unset($array[$key]); 
     } 
    } 
    return count($array); 
}