Получить свойство (тип: массив), имя которого сгенерированно динамически

Тема в разделе "PHP", создана пользователем trooll, 22 мар 2012.

Модераторы: latteo
  1. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Есть класс в нем есть свойства как обычные переменные так и свойства в виде массива.

    Так вот мне необходимо получить свойство (тип: массив), имя которого будет сгенерированно динамически пример:


    PHP:
    public $var 'test_var';
    public 
    $test_array =  array('111''222''333');
     
    function 
    test() {
    $temp 'var';
    echo 
    $this->$temp//здесь выведит все как надо
     
    $temp 'test_array[1]';
    echo 
    $this->$temp//здесь выведит пустоту
    }

    Вообще сталкивался кто нибудь с таким, есть ли какой способ решить эту задачу
     
  2. Genk0

    Genk0 Инквизитор из раздела J!

    Moderator
    Регистр.:
    2 июн 2010
    Сообщения:
    1.627
    Симпатии:
    1.330
    может я не прав, но
    $temp = 'test_array[1]';
    пишется как
    $temp = $test_array[1];
    тогда он выведет второе значение из массива - var222
     
  3. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Хз, я не знаю как сделать это без особых примочек. Просто пхп ищет переменную с именем `test_array[1]` Возможно это есть в пхп5.4 я не проверял.
    Как можно сделать:
    1. Хороший способ- просто сделать метод типа

    $this->getClassVar ( 'test_array[1]');

    а в функции getClassVar реализовать проверку на наличие [1] \ можно через eval
    2. Менее очевидный но гемора меньше (если этой магии нет)
    через __get($name) в name бужет 'test_array[1]'
     
    trooll нравится это.
  4. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    В общем сейчас попробовал можно извратиться вот так:

    PHP:
    public $var 'test_var';
    public 
    $test_array =  array('111''222''333');
     
    function 
    test() {
    $temp 'var';
    echo 
    $this->$temp//здесь выведит все как надо
     
    $temp 'test_array';
    $temp $this->$temp;
     
    echo 
    $temp[1]; // вы ведит то что надо
    }
    В общем так выведет элемент массива необходимый, но для полной реализации задуманного придется делать как предложил KillDead , прогонять через функцию.
     
  5. shaen

    shaen Постоялец

    Регистр.:
    23 июн 2011
    Сообщения:
    51
    Симпатии:
    9
    Ну если я правильно понял задачу то можно еще воспользоваться классом php ArrayAccess и его методами
     
  6. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    В общем навоял то что мне было необходимо. Код выдернут из рабочего класса так что если кому будет необходим допилите под себя. Что бы функция начала работать необходимо передать первый параметр в виде: 'array.sub_array.i_t_d' . точки обозначают вложенность элемента массива. собственно сама функция:

    PHP:
        function get_array_val($v null$v2 false) {
            if (!
    $v) {
                return 
    false;
            }
     
            if (
    $v2) {
                return 
    $v[$v2];
            }
            else {
                
    $v explode('.'$v);
                
    $temp $this->$v[0];
            }
     
            if (!isset(
    $v[1])) {
                return 
    false;
            }
     
            for (
    $i=1$n sizeof($v); $i<$n$i++) {
                if (
    is_array($temp[$v[$i]])) {
                    
    $temp $this->get_array_val($temp$v[$i]);
                }
                else {
                    
    $temp $temp[$v[$i]];
                }
            }
     
            return 
    $temp;
        }
    p.s.: Функция только что была испечена так что является довольно сырой и не объезженной, возможны какие то баги. Функция при обработки вложенности использует рекурсию так что будьте осторожны когда будите обрабатывать этой функцией много тысячные массивы.
     
  7. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Ага забыл только сказать всем как ты вынес мозг себе мне и всем кто читал топик и в итоге после того как сделал понял что тебе оно не нужно. :facepalm:

    Нужно читать что требуется а не на синтаксис смотреть.
    Ему не переровнять нужно... Ему в этой переменной по сути адрес переменной нужен. Я ему говарил блин eval спасет мир. но нет же он чхать хотел на это... сделал как всегда по свойму... А потом меня ещё называет извращенцем рожденным под звездой абуфискации...
     
  8. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Да ладно тебе, не так уж оно было и страшно то.

    Кстати да как оказалось в итоге эта функция мне не понадобилась, но все же думаю функция кому то да и будет полезной.