За последние 24 часа нас посетили 16419 программистов и 1678 роботов. Сейчас ищут 909 программистов ...

значение в массиве по индексу, заданному строкой

Тема в разделе "Прочие вопросы по PHP", создана пользователем Yudik, 29 янв 2012.

  1. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    Есть такая задача - получить из многомерного массива значение, причем индекс задан в строке, пример:
    дано -
    массив: $arr;
    строка: $ind = "['lev1']['sublev1_1'][sublev1_1_1][3]"
    Получить значение $arr['lev1']['sublev1_1'][sublev1_1_1][3]
    -------------------------------------------------------------------------------------------
    Интересует как это можно сделать просто и не используя вариант $"arr$ind" ??
     
  2. yuri

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

    С нами с:
    16 янв 2012
    Сообщения:
    288
    Симпатии:
    2
    разобрать регулярками строку preg_match("/\[(.*)\]/",$ind,$p) и собрать обратно:
    $arr[$p[1]][$p[2]][$p[3]]
    как-то так....
     
  3. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    так как мы не знаем изначально количество ключей, от тут еще придется писать дополнительный код, наподобии:
    Код (Text):
    1.  
    2. preg_match("/\[(.*)\]/",$ind,$p);
    3. $val = $arr;
    4. foreach($p as $ind){
    5.    $val = $val[$ind];
    6. }
    что уже не так лаконично.
    Какие-нибудь еще варианты есть ??
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Избавиться от такой ситуации, когда ключ нужного элемента массива оказывается в строке текста, с которой потом извращаться приходится.
     
  5. yuri

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

    С нами с:
    16 янв 2012
    Сообщения:
    288
    Симпатии:
    2
  6. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    Если бы это было возможно так бы и сделал...
    какие еще варианты решения есть (может есть какая спец. функция для массивов, которую не знаю) ?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а фокус с двумя долларами в данном случае не проканает?
     
  8. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    - собственно я и имел это ввиду, просто неправильно написал . Но оказывается такой вариант
    Код (Text):
    1. $gg = "arr";
    2. $ind = "['lev1']['sublev1_1'][sublev1_1_1][3]";
    3. $gi = $gg.$ind;
    4. $val = $$gi
    всеравно не сработал :( . Хотя был уверен что сработает....
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну бей по ][ и в цикл
     
  10. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    так это от же самое что и вариант с регулярками, а меня интересует: нет ли какой встроенной спец.функции для этой цели... очень бы надо
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    обычно так никто не делает просто. объясни мотивацию =)
     
  12. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    начал было расписывать зачем мне это понадобилось... ну-ка нафиг, проще регулярки использовать, чем расписать :)
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не верю (с)
     
  14. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    А если разбить строку как массив ключей и далее рекурсивно обратиться к последнему ключу массиву?

    P.S. Нужно будет использовать ссылки, в частности, передача по значению...
     
  15. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    действительно быстрее написать код с использованием регулярок, чем описать тот алгоритм, для которого нужно решение этой задачи

    Не совсем понял о чем речь...
     
  16. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Стало самому интересно, решил сделать для себя, но код конечно покажу
    Код (PHP):
    1. <?php
    2. $str = "['a']['b']['c']";
    3. $arr = array('a' => array('b' => array('c' => 'value')));
    4. preg_match_all("~\['(.*?)'\]~", $str, $matches);
    5. $str = $matches[1];
    6. function arr_rec($str, $arr)
    7. {
    8.     $strLen = count($str);
    9.     $arrTmp = &$arr;
    10.     for($i = 0; $i < $strLen; $i++)
    11.     {
    12.         if (!is_array($arrTmp[$str[$i]])) {
    13.             return $arrTmp[$str[$i]];
    14.         } else {
    15.             $arrTmp = &$arrTmp[$str[$i]];
    16.         }
    17.     }
    18. }
    19. echo arr_rec($str, $arr); 
    . В терминологии программирования не особо силен, но если прав, то это косвенная рекурсия :)

    P.S. Наврал, сейчас прочитал. Есть два типа рекурсий: прямая (функция вызывает сама себя) и косвенная (функция вызывает другую функцию), тобишь это просто функция, но ее можно переписать и как рекурсию :)
     
  17. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    действительно быстрее написать код с использованием регулярок, чем описать тот алгоритм, для которого нужно решение этой задачи

    хотя щс попробую

    :) намного проще использоват код с регулярками, который написан повыше
     
  18. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Как известно, у любой задачи есть несколько вариантов решения :)
     
  19. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    упрощенно суть: есть страничка где выбираем подключаемый модуль: выбрали->происходит запрос к скрипту, в котором создатся объект модуля и вызывается его метод возврата хтмл-кода формы настроек этого модуля.->модуль вернул форму с дефолтными значениями параметров
    Так как могут быть подключены несколько однотипных модулей и для каждого могут быть заданы свои параметры, то и в возвращаемых формах имена элементов должны различаться, для этого и служит префикс вида "module[adm_page][modules][banners1][parametrs]" ->установили нужные параметры для модуля нажали "отправить" -> грузится исходная страничка(где выбираем какие модули подключать) тут же подключается класс подключенного модуля и вызывается метод возврата настроек с передачей в метод префикса и списка установленных параметров ( array("ИмяПараметраМодуля"=>Значение, "ИмяДругогоПараметраМодуля"=>Значение) ) в простом случае модуль может проанализировать эти параметры и сделать необходимые действия, так как значения параметров установленные в форме настройки админ-страничка передала(опять таки админ-страничка их вычислила только потому что ,именно, она задает префикс) . Но как быть если в форме настройки модуля присутствует поле с типом "file" и составным именем "module[adm_page][modules][banners1][parametrs]" ? т.е. когда мы в форме настройки выбрали нужный файл и нажали "Отправить" , то админ-страничка в параметрах методу возврата формы модуля передать ничего не может и, соответсвенно, модуль должен сам найти присланный файл исходя из содержимого $_FILES['module']['tmp_name'][adm_page][modules][banners1][parametrs][img] , т.е. модуль должен разбить присланный префикс на две части, вставить между ними стандартный ключ ['tmp_name'] и после этого взять из $_FILES нужное значение временного файла и сохранить его в нужное место.....
    Вообщем вот так как то
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну короче тут нах не всралось всё это дело которое ты тут пытаешься изобрести =)

    и вобще, осваивай бд. хотя это и на файлах все реализуется за 10 минут.
     
  21. Yudik

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

    С нами с:
    25 фев 2011
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    где то в РФ
    ну БД так то тут , вообще, ни при чем ... ну и
    поэтому решил несколько иначе, хотя хотелось бы сделать так как было задумано.....
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а, ну не при чем, так не при чем =)
     
  23. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Велосипедисты, eval вам в помощь =)

    И еще. Прочитал эпос на тему кучи модулей и прочей белиберды в рамках ООП написанного топик стартером. Программируй на основе интерфейсов, а не их реализации.
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тут вобще ничего такого не требуется...
     
  25. asokol

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

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    Yudik, возможно, был приведен очень упрощенный вариант, но что мешает в начале формы настроек модуля указать input type="hidden", в котором разместить [module][adm_page][modules][banners1][parametrs][​IMG]