Люди подскажите пожалуйста, голову ломаю уже которые сутки Мне нужно удалить элемент массива по заданному ключу, т.е. допустим у меня задан ключ массива ввиде строки /root/user/admin это значит я должен сделать unset($arr['root']['user']['admin']) но проблема заключается в том, что строка может быть длинее и заранее она не известна. P.S. Я пытался решить эту задачу с помощью $$ - переменная переменных, читал документацию по хешам но ничего не придумал. P.P.S. eval сразу отбрасываем, рекурсии как вариант можно попробовать.
Ссылки, вам батенька, в помощь. Основная идея такова, что берём цикл кол-вом итераций вложенность - 1 и делаем примерно следующее (1 в 1 не копировать, т.к. пишу с головы идею без тестов работает ли код или нет): PHP: <?php $arr = array('root' => array('user' => array('admin' => 'bla'))); $path = '/root/user/admin'; $keys = explode('/', ltrim($path, '/')); $item = null; for ($i = 0, $cnt = count($keys); $i < $cnt; ++$i) { if ($item == null) { $item =& $arr[$keys[$i]]; } else { $item =& $item[$keys[$i]; } if ($i == $cnt - 1) { // Удаляем элемент unset($item[$keys[$i+1]]); // Удаляем ссылку unset($item); // Заканчиваем цикл break; } } В общем ссылки - наше всё. А ещё говорят PHP простой, там нифига знать не надо. Ага, конечно..
Большое спасибо, но не получается помогите всё таки собрать более менее рабочий вариант Вот выписка из статьи Жесткие ссылки в PHP Жесткая ссылка представляет собой просто переменную, которая является синонимом другой переменной. Многоуровневые ссылки (то есть, ссылка на ссылку на переменную, как это можно делать, например, в Perl) не поддерживаются.
Максимум до чего я доехал PHP: <?php $path = '/root/user/admin'; $keys = explode('/', $path); $a = array('root' => array('user' => array('admin' => 'bla','fedor'=>'bla'))); $c = & $a[$keys[1]][$keys[2]]; unset($c[$keys[3]]); print_r($a); ?> Как бы теперь цикл организовать?
Всем спасибо за проявленый интерес, после долгих мытарств родилось следующее Код (Text): $a = array('root' => array('user' => array('admin' => 'bla','fedor'=>'bla'))); $path = 'root/user/admin'; $keys = explode('/', $path); $n = count($keys); $c = & $a; for($i=0; $i < $n-1; $i++) $c = & $c[$keys[$i]]; if (is_array($c)) unset($c[$keys[$i]]); print_r($a); Всем спасибо за проявленый интерес и правильную идею.
После небольшой косметики получаем следующий вариант Код (Text): $a = array('root' => array('user' => array('admin' => 'bla','fedor'=>'bla'))); $path = 'root/user/admin'; $keys = explode('/', $path); $last = array_pop($keys); $c = & $a; foreach($keys as $key) $c = & $c[$key]; if (is_array($c)) unset($c[$last]); print_r($a); Прям интересно стало