За последние 24 часа нас посетили 23717 программистов и 1730 роботов. Сейчас ищут 1393 программиста ...

сложный индекс массива

Тема в разделе "PHP для новичков", создана пользователем pluto, 2 сен 2010.

  1. pluto

    pluto Активный пользователь

    С нами с:
    9 дек 2007
    Сообщения:
    28
    Симпатии:
    0
    Люди подскажите пожалуйста, голову ломаю уже которые сутки

    Мне нужно удалить элемент массива по заданному ключу, т.е. допустим у меня задан ключ массива ввиде строки /root/user/admin это значит я должен сделать unset($arr['root']['user']['admin']) но проблема заключается в том, что строка может быть длинее и заранее она не известна.

    P.S. Я пытался решить эту задачу с помощью $$ - переменная переменных, читал документацию по хешам но ничего не придумал.

    P.P.S. eval сразу отбрасываем, рекурсии как вариант можно попробовать.
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Ссылки, вам батенька, в помощь.

    Основная идея такова, что берём цикл кол-вом итераций вложенность - 1 и делаем примерно следующее (1 в 1 не копировать, т.к. пишу с головы идею без тестов работает ли код или нет):
    PHP:
    1. <?php
    2. $arr = array('root' => array('user' => array('admin' => 'bla')));
    3. $path = '/root/user/admin';
    4. $keys = explode('/', ltrim($path, '/'));
    5. $item = null;
    6. for ($i = 0, $cnt = count($keys); $i < $cnt; ++$i) {
    7.     if ($item == null) {
    8.         $item =& $arr[$keys[$i]];
    9.     } else {
    10.         $item =& $item[$keys[$i];
    11.     }
    12.     if ($i == $cnt - 1) {
    13.         // Удаляем элемент
    14.         unset($item[$keys[$i+1]]);
    15.         // Удаляем ссылку
    16.         unset($item);
    17.         // Заканчиваем цикл
    18.         break;
    19.     }
    20. }
    21.  
    В общем ссылки - наше всё. А ещё говорят PHP простой, там нифига знать не надо. Ага, конечно.. :D
     
  3. pluto

    pluto Активный пользователь

    С нами с:
    9 дек 2007
    Сообщения:
    28
    Симпатии:
    0
    Большое спасибо, но не получается :( помогите всё таки собрать более менее рабочий вариант

    Вот выписка из статьи

    Жесткие ссылки в PHP

    Жесткая ссылка представляет собой просто переменную, которая является синонимом другой переменной. Многоуровневые ссылки (то есть, ссылка на ссылку на переменную, как это можно делать, например, в Perl) не поддерживаются.
     
  4. pluto

    pluto Активный пользователь

    С нами с:
    9 дек 2007
    Сообщения:
    28
    Симпатии:
    0
    Максимум до чего я доехал

    PHP:
    1. <?php
    2.  
    3. $path = '/root/user/admin';
    4.  
    5. $keys = explode('/', $path);
    6.  
    7. $a = array('root' => array('user' => array('admin' => 'bla','fedor'=>'bla')));
    8.  
    9. $c = & $a[$keys[1]][$keys[2]];
    10.  
    11. unset($c[$keys[3]]);
    12.  
    13. print_r($a);
    14.  
    15. ?>
    Как бы теперь цикл организовать?
     
  5. pluto

    pluto Активный пользователь

    С нами с:
    9 дек 2007
    Сообщения:
    28
    Симпатии:
    0
    Всем спасибо за проявленый интерес, после долгих мытарств родилось следующее


    Код (Text):
    1. $a = array('root' => array('user' => array('admin' => 'bla','fedor'=>'bla')));
    2.  
    3. $path = 'root/user/admin';
    4.  
    5. $keys = explode('/', $path);
    6.  
    7. $n = count($keys);
    8.  
    9. $c = & $a;
    10.  
    11. for($i=0; $i < $n-1; $i++) $c = & $c[$keys[$i]];
    12.  
    13. if (is_array($c)) unset($c[$keys[$i]]);
    14.  
    15. print_r($a);
    Всем спасибо за проявленый интерес и правильную идею.
     
  6. pluto

    pluto Активный пользователь

    С нами с:
    9 дек 2007
    Сообщения:
    28
    Симпатии:
    0
    После небольшой косметики получаем следующий вариант

    Код (Text):
    1. $a = array('root' => array('user' => array('admin' => 'bla','fedor'=>'bla')));
    2.  
    3. $path = 'root/user/admin';
    4.  
    5. $keys = explode('/', $path);
    6.  
    7. $last = array_pop($keys);
    8.  
    9. $c = & $a;
    10.  
    11. foreach($keys as $key) $c = & $c[$key];
    12.  
    13. if (is_array($c)) unset($c[$last]);
    14.  
    15. print_r($a);
    Прям интересно стало :)