У меня такой массив
$arr = [ 'baz' => [ 'foo' => [ 'boo' => 'whatever' ] ] ];
Есть ли способ отключить значение ['boo'], используя ввод строки?
Что-то вроде того
$str = 'baz->foo->boo'; function array_unset($str, $arr) { // magic here unset($arr['baz']['foo']['boo']); return $arr; }
с$str = 'baz->foo->boo'; function array_unset($str, $arr) { // magic here unset($arr['baz']['foo']['boo']); return $arr; }
Этот ответ был потрясающим, и это сделало первую часть моего запуска скрипта. Используя строковый путь для установки вложенных данных массива . Но это не может измениться. PS eval () не вариант 🙁
Поскольку вы не можете вызвать unset в ссылочном элементе, вам нужно использовать другой трюк:
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);
с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);
По сути, вы проходите дерево массива, но сохраняете ссылку на последний массив (предпоследний узел), из которого вы хотите удалить узел. Затем вы вызываете unset
в последнем массиве, передавая последний узел в качестве ключа.
Проверьте этот код
Это похоже на Wouter Huysentruit's. Разница в том, что он возвращает значение null, если вы передаете недопустимый путь.
function array_unset(&$array, $path) { $pieces = explode('.', $path); $i = 0; while($i < count($pieces)-1) { $piece = $pieces[$i]; if (!is_array($array) || !array_key_exists($piece, $array)) { return null; } $array = &$array[$piece]; $i++; } $piece = end($pieces); unset($array[$piece]); return $array; }
сfunction array_unset(&$array, $path) { $pieces = explode('.', $path); $i = 0; while($i < count($pieces)-1) { $piece = $pieces[$i]; if (!is_array($array) || !array_key_exists($piece, $array)) { return null; } $array = &$array[$piece]; $i++; } $piece = end($pieces); unset($array[$piece]); return $array; }
Что-то «на лету», которое может сработать для вас:
$str = 'bar,foo,boo'; function array_unset($str,&$arr) { $path = explode(',',$str); $buf = $arr; for($i=0;$i<count($path)-1;$i++) { $buf = &$buf[$path[$i]]; } unset($buf); }
с$str = 'bar,foo,boo'; function array_unset($str,&$arr) { $path = explode(',',$str); $buf = $arr; for($i=0;$i<count($path)-1;$i++) { $buf = &$buf[$path[$i]]; } unset($buf); }