Intereting Posts
php datetime-> diff вычисляет неправильное количество часов (3 слишком много) Проверка JQuery не работает Поле MYSQL Date всегда выводит 0000-00-00 Codeigniter – запрошенный URL не найден на этом сервере MySQL: используйте значение CASE / ELSE в качестве параметра соединения передавать несколько значений текстового поля в контроллер. Наследование PHP, родительские функции с использованием дочерних переменных Неустранимая ошибка: использование $ this, если не в контексте контекста объяснения? PHP: как кодировать бесконечности или числа NaN для JSON? Массив MIDB Freebase и отправка нескольких запросов в freebase программный вход в facebook и сообщение на страницу (стена) Сортировка html-таблицы с href и php из базы данных sql Android: запрос строки Volley onresponse не вызывается TYPO3: Как визуализировать текстовые элементы tt_content в моих собственных расширениях? с помощью google-api-php-клиента, неспособного создать правильный signedurl

Использование строкового пути для удаления элемента из массива

У меня такой массив

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