I have array like that
$arr = [
'baz' => [
'foo' => [
'boo' => 'whatever'
]
]
];
Is there anyway to unset ['boo'] value using string input?
Something like that
$str = 'baz->foo->boo';
function array_unset($str, $arr) {
// magic here
unset($arr['baz']['foo']['boo']);
return $arr;
}
This answer was awesome, and it's made first part of my script run Using a string path to set nested array data . But It's can't reverse. P.S. eval() is not an option :(
Since you can't call unset on a referenced element, you need to use another trick:
function array_unset($str, &$arr)
{
$nodes = split("->", $str);
$prevEl = NULL;
$el = &$arr;
foreach ($nodes as &$node)
{
$prevEl = &$el;
$el = &$el[$node];
}
if ($prevEl !== NULL)
unset($prevEl[$node]);
return $arr;
}
$str = "baz->foo->boo";
array_unset($str, $arr);
In essence, you traverse the array tree but keep a reference to the last array (penultimate node), from which you want to delete the node. Then you call unset
on the last array, passing the last node as a key.