Отменить внутри array_walk_recursive не работает

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?

Здесь вы не можете использовать 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)); 

unset($val) удаляет только локальную переменную $val .

Нет (разумного) способа, как вы можете удалить элемент из массива внутри array_walk_recursive . Для этого вам, вероятно, придется написать пользовательскую рекурсивную функцию.

Ответ @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); } с 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); } с 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); }