Получить эл. массива из арг. функции

Romul

Новичок
Получить эл. массива из арг. функции

Всем привет
PHP:
public function get()
{
        $args = func_get_args();
        return $this->_data[$args[0]];
}
как сделать так, что бы $obj->get('1', '2'); вернул $this->_data[1][2]
мозг взорвал, не могу придумать как... пробовал через $$ - не получилось (может и можно... но как?), eval юзать не хочется
?

зарание спасиб за идеи, намеки...
 

itprog

Cruftsman
Romul
ну тут можно так:
PHP:
public function get()
{
        $args = func_get_args();
        $data = $this->_data;
        foreach ($args as $i) {
              $data = $data[$i];
        }
        return $data;
}
 

Romul

Новичок
itprog
ага, работает, пасиб =)
а короче как-нить можно? без циклов...

пробовал так через eval

PHP:
public function get()
{
        $count = func_num_args();
        $args = func_get_args();
        eval('$key = $this->_data[\''.implode('\'][\'', $args).'\'];');
        echo $key;
}
но это убого...
 

HraKK

Мудак
Команда форума
Romul
Забудь про EVAL раз и навсегда. Навсегда. ясно?
 

Romul

Новичок
itprog
массив $this->_data нереально большой... надеюсь все же есть способ просто получить необходимый эл. по индексам

HraKK
спасибо, учитель, за важный совет...
 

HraKK

Мудак
Команда форума
<?php

class a
{
var $data;

function a()
{
$this->data[1][3]='fff';
}

function get()
{
$args = func_get_args();
$key = $this->data[$args[0]][$args[1]];
echo $key;
}
}
$A = NEW A();
$A->GET(1,3);

?>

Romul
А про Эвал поверь, это очень важно
 

Romul

Новичок
HraKK
супер!!!
а если
PHP:
$a->get(1, 2, 3);
?
массив нереально большой как в длинну так и в ширь

профилирование показало, что вариант с eval-ом пока лидирует... ибо по циклу бегать это ппц, а старая модель с $this->_data->el1->el2->el3 тормозит жутко на формировании, на отдаче (get()) он лидирует.
 

HraKK

Мудак
Команда форума
на скока он в "ширину" большой?
И вообще что это за массив?
 

Romul

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

HraKK

Мудак
Команда форума
mb что-то такое? Тока тут регистр а у вас синклетон, разница не существенная.
<?php
class registry
{


function registerENV($_nameVar,$_dataVar,$type = false)
{
switch ($type)
{

case 1: $GLOBALS['ENV']["$_nameVar"][] = $_dataVar;break;
default : $GLOBALS['ENV']["$_nameVar"] = $_dataVar;break;
}

}


function getENV($_nameVar)
{
return (isset($GLOBALS['ENV']["$_nameVar"]))?$GLOBALS['ENV']["$_nameVar"]:false;
}
}
?>
 

Romul

Новичок
HraKK
не удобно
Заливка производиться слитием существующего массива _data с добавляемым... что работает достаточно быстро. Каждый эл. отдельно писать - геммор.
А вот забирать надо по ключам.
Еще потестил вариант itprog и eval, при каком-то рубеже по массиву бегать быстрее... eval много все же жрет (помимо того, что это кривое решение)
думаю дальше...
 

HraKK

Мудак
Команда форума
хм я пас. Меняйте архитектуру.
Удобство vs Скорость
 

Romul

Новичок
Romul
спасибо... если ничего не придумаю, возьму вариант itprog. Хотя создавать столько массивов гружено... но это полюбому лучше чем eval
 

itprog

Cruftsman
это единственный вариант :)
Массивы там по идее не создаются, внутри PHP копируется только ссылка на его элемент
 

Romul

Новичок
itprog
да... по тестам уже вижу что че-то напутал, твой вариант быстрее в разы =)
я все мечтаю что это как-то можно сделать через $$... но чую он индексы не воспринимает

-~{}~ 24.06.07 02:51:

да... походу единственный вариант, спасибо!
 

HraKK

Мудак
Команда форума
А как насчет такого?
<?php

class a
{
var $data;

function a()
{
$this->data[1][3][2]='fff';
}

function &get(&$data,$args)
{
if(count($args)>0)
{
$data = &$data[$args[0]];
array_shift($args);
return $this->get(&$data,$args);
}
else
{
return $data;
}
}
}
$A = NEW A();
print $A->GET(&$A->data,array(1,3,2));
?>


itprog
Не единственный be-be-be:D

-~{}~ 24.06.07 03:09:

те же яйца только в профиль через рекурсию и масивы))
 

С.

Продвинутый новичок
Re: Получить эл. массива из арг. функции

PHP:
public function get()
{
        $args = func_get_args();
        switch (count($args))
        {
            case 1: return $this->_data[$args[0]];
            case 2: return $this->_data[$args[0]][$args[1]];
            case 3: return $this->_data[$args[0]][$args[1][$args[2]];
            ...
        }
}
 

С.

Продвинутый новичок
массив нереально большой как в длинну так и в ширь
Где здесь слово "глубина"? Она у него наверняка и до четырех не доходит. Или ты думаешь он вызывает this->get() с 43-мя параметрами?
 
Сверху