Есть такая задача - получить из многомерного массива значение, причем индекс задан в строке, пример: дано - массив: $arr; строка: $ind = "['lev1']['sublev1_1'][sublev1_1_1][3]" Получить значение $arr['lev1']['sublev1_1'][sublev1_1_1][3] ------------------------------------------------------------------------------------------- Интересует как это можно сделать просто и не используя вариант $"arr$ind" ??
разобрать регулярками строку preg_match("/\[(.*)\]/",$ind,$p) и собрать обратно: $arr[$p[1]][$p[2]][$p[3]] как-то так....
так как мы не знаем изначально количество ключей, от тут еще придется писать дополнительный код, наподобии: Код (Text): preg_match("/\[(.*)\]/",$ind,$p); $val = $arr; foreach($p as $ind){ $val = $val[$ind]; } что уже не так лаконично. Какие-нибудь еще варианты есть ??
Избавиться от такой ситуации, когда ключ нужного элемента массива оказывается в строке текста, с которой потом извращаться приходится.
Если бы это было возможно так бы и сделал... какие еще варианты решения есть (может есть какая спец. функция для массивов, которую не знаю) ?
- собственно я и имел это ввиду, просто неправильно написал . Но оказывается такой вариант Код (Text): $gg = "arr"; $ind = "['lev1']['sublev1_1'][sublev1_1_1][3]"; $gi = $gg.$ind; $val = $$gi всеравно не сработал . Хотя был уверен что сработает....
так это от же самое что и вариант с регулярками, а меня интересует: нет ли какой встроенной спец.функции для этой цели... очень бы надо
начал было расписывать зачем мне это понадобилось... ну-ка нафиг, проще регулярки использовать, чем расписать
А если разбить строку как массив ключей и далее рекурсивно обратиться к последнему ключу массиву? P.S. Нужно будет использовать ссылки, в частности, передача по значению...
действительно быстрее написать код с использованием регулярок, чем описать тот алгоритм, для которого нужно решение этой задачи Не совсем понял о чем речь...
Стало самому интересно, решил сделать для себя, но код конечно покажу Код (PHP): <?php $str = "['a']['b']['c']"; $arr = array('a' => array('b' => array('c' => 'value'))); preg_match_all("~\['(.*?)'\]~", $str, $matches); $str = $matches[1]; function arr_rec($str, $arr) { $strLen = count($str); $arrTmp = &$arr; for($i = 0; $i < $strLen; $i++) { if (!is_array($arrTmp[$str[$i]])) { return $arrTmp[$str[$i]]; } else { $arrTmp = &$arrTmp[$str[$i]]; } } } echo arr_rec($str, $arr); . В терминологии программирования не особо силен, но если прав, то это косвенная рекурсия P.S. Наврал, сейчас прочитал. Есть два типа рекурсий: прямая (функция вызывает сама себя) и косвенная (функция вызывает другую функцию), тобишь это просто функция, но ее можно переписать и как рекурсию
действительно быстрее написать код с использованием регулярок, чем описать тот алгоритм, для которого нужно решение этой задачи хотя щс попробую намного проще использоват код с регулярками, который написан повыше
упрощенно суть: есть страничка где выбираем подключаемый модуль: выбрали->происходит запрос к скрипту, в котором создатся объект модуля и вызывается его метод возврата хтмл-кода формы настроек этого модуля.->модуль вернул форму с дефолтными значениями параметров Так как могут быть подключены несколько однотипных модулей и для каждого могут быть заданы свои параметры, то и в возвращаемых формах имена элементов должны различаться, для этого и служит префикс вида "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 нужное значение временного файла и сохранить его в нужное место..... Вообщем вот так как то
ну короче тут нах не всралось всё это дело которое ты тут пытаешься изобрести =) и вобще, осваивай бд. хотя это и на файлах все реализуется за 10 минут.
ну БД так то тут , вообще, ни при чем ... ну и поэтому решил несколько иначе, хотя хотелось бы сделать так как было задумано.....
Велосипедисты, eval вам в помощь =) И еще. Прочитал эпос на тему кучи модулей и прочей белиберды в рамках ООП написанного топик стартером. Программируй на основе интерфейсов, а не их реализации.
Yudik, возможно, был приведен очень упрощенный вариант, но что мешает в начале формы настроек модуля указать input type="hidden", в котором разместить [module][adm_page][modules][banners1][parametrs]