Ключ массива из строки [key1][key2] можно заставить работать?

Sailorman

Новичок
Ключ массива из строки [key1][key2] можно заставить работать?

ногами просьба не быть.

например:

$keys = "['key1']['key2']";
$arr{$keys} = 777;
var_dump($arr);

выдаст:

array(1) {
["['key1']['key2']"]=>
int(777)

а вот хотелось бы что б было:

array(1) {
["key1"]=>
array(1) {
["key2"]=>
int(777)
}

можно ли добиться этого?
 

Frol

Новичок
если ногами и бить, то только Skubent.

Sailorman
откуда берется переменная $keys?
 

Sailorman

Новичок
Это конечно совсем не красиво, но она берется тогда, когда функция проходит по массиву и если видит, что элемент массива массив вызывает себя же со всякими параметрами, а чтоб не потерять имя элемента, приходится извращаться :(
Я уверен, что есть красивше решения, но пока я (чайник) сам допер только до такого извращения:

PHP:
<?php

$code[] = "skjdfkj ### @@@1 <раз> ffferf,@@@ @@@2 <два> refrf,@@@ @@@3 <три> feref@@@ ### sdfdf";

$preg_tpl['request'] = ".*?### (.*?) ###.*?";

$preg_tpl['text']['request'] = ".*?@@@(.*?)@@@.*?";

$preg_tpl['text']['num']['request'] = "(.) <.*?";


function go ($preg_tpl, $code, &$zz, $var_name) {

	foreach ($preg_tpl as $key => $val) {
		
		if(is_array($val)) {
			$var_name .= "['$key']";
			go($val, $result[1], $zz, $var_name);
		} else {
			$total = '';
			foreach ($code as $num_code => $code_text) {
				preg_match_all("~$val~si", $code_text, $result);
				$str = '$' . $var_name . '[] = "' . $result[1][0] . '";';
				eval($str);
			}
		}
	}
}

$zz = array();
go ($preg_tpl, $code, $zz, 'zz');
var_dump($zz);
?>
 

Фанат

oncle terrible
Команда форума
это какой-то чудовищный бред.
функция проходит по массиву и если видит, что элемент массива массив вызывает себя же со всякими параметрами,
можно посмотреть пример этого чудо-массива?

ЗЫ. одно непонятнео. если уж всё равно использвется евал, то какой смысл тогда вообще в этих кустарных шаблонах, если есть нормальный язык пхп - становится и вовсе непонятно
 

Sailorman

Новичок
Прохожит функция по этому массиву:
$preg_tpl['request'] = ".*?### (.*?) ###.*?";
$preg_tpl['text']['request'] = ".*?@@@(.*?)@@@.*?";
$preg_tpl['text']['num']['request'] = "(.) <.*?";

На самом деле я уже понял что это бред, и надо переписывать, но решение так и не придумал... Если можете посоветовать, буду очень признателен.
 

Фанат

oncle terrible
Команда форума
решение номер 1, кардинальное: переписать этот кустарный шаблон на пхп.
таким образом все проблему отпадут разом
$odin=1;
$dva=2;
$tri=3;
include ''shablon.php';
asdfasdf <?=$odin?> asdfasdfsdf <?=$dva?> <?=$tri?>

решение номер 2, обычное, но сложное.
сформулировать словами человеческого языка, что ты делаешь, чего хочешь, и какие проблемы.
Я понимаю, что ты всеьма смутно знаешь ответы на эти вопросы, но если ты хочешь хоть что-то услышать на форуме, то придётся напрячься.
 

Sailorman

Новичок
Фанат
это не шаблон для вывода, а шаблон для разбора текста на куски.

т.е.
задается массив шаблон:
$preg_tpl['request'] = ".*?### (.*?) ###.*?";
$preg_tpl['text']['request'] = ".*?@@@(.*?)@@@.*?";
$preg_tpl['text']['num']['request'] = "(.) <.*?";

и текст:
$code[] = "skjdfkj ### @@@1 <раз> ffferf,@@@ @@@2 <два> refrf,@@@ @@@3 <три> feref@@@ ### sdfdf";

из масива шаблона берется первое условие и из текста выдирается и добавляется в новый массив кусок текста совпадающий с шаблоном.
потом берется второе условие из шаблона и применяется к полученому тексту с помощью первого шаблона и так далее.
 

whirlwind

TDD infected, paranoid
> и текст:
$code[] = "skjdfkj ### @@@1 <раз> ffferf,@@@ @@@2 <два> refrf,@@@ @@@3 <три> feref@@@ ### sdfdf";

Что бы мы совсем поняли, напиши, что должно получиться в результате обработки этой строки
 

Фанат

oncle terrible
Команда форума
откда берётся эта белиберда с решёточками и собачечками?
 

Sailorman

Новичок
$code[] = "skjdfkj ### @@@1 <раз> ffferf,@@@ @@@2 <два> refrf,@@@ @@@3 <три> feref@@@ ### sdfdf";

в результате:

$zz это:
array(2) {
[0]=>
string(72) "@@@1 <раз> ffreferf,@@@ @@@2 <два> refrefref,@@@ @@@3 <три> fererfref@@@"
["text"]=>
array(2) {
[0]=>
string(17) "1 <раз> ffreferf,"
["num"]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
}
}

-~{}~ 05.09.06 11:12:

Фанат

это грубо говоря текст со всякими разделителями.
книга в электронном виде.
конечно разделители там не в виде @@@, а другими, но это не суть, главное разобрать данный текст по шаблону.
 

Skubent

Новичок
Frol, есть более "правильное" решение задачи, описанной в начальном топике ?
 

whirlwind

TDD infected, paranoid
Sailorman это практически синтаксический анализатор. трудно воспринять это в модульном принципе. абстрагируйся до chunks, станет легче. можешь посмотреть какой нить простенький XML-парсер для примера, если хочешь получить универсальное решение. А если уровней вложенности немного, то можно использовать replace_callback для разбора вложенных конструкций.
 

Фанат

oncle terrible
Команда форума
стоп

-~{}~ 05.09.06 12:56:

зачем передавать var_name , когда моржно передавать саму переменную?
 
Сверху