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); }