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

trooll

PHP кодер
Регистрация
22 Дек 2008
Сообщения
482
Реакции
117
Есть класс в нем есть свойства как обычные переменные так и свойства в виде массива.

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


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; //здесь выведит пустоту
}


Вообще сталкивался кто нибудь с таким, есть ли какой способ решить эту задачу
 
может я не прав, но
$temp = 'test_array[1]';
пишется как
$temp = $test_array[1];
тогда он выведет второе значение из массива - var222
 
Хз, я не знаю как сделать это без особых примочек. Просто пхп ищет переменную с именем `test_array[1]` Возможно это есть в пхп5.4 я не проверял.
Как можно сделать:
1. Хороший способ- просто сделать метод типа

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

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

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]; // вы ведит то что надо
}

В общем так выведет элемент массива необходимый, но для полной реализации задуманного придется делать как предложил Для просмотра ссылки Войди или Зарегистрируйся , прогонять через функцию.
 
Ну если я правильно понял задачу то можно еще воспользоваться классом php ArrayAccess и его методами
 
В общем навоял то что мне было необходимо. Код выдернут из рабочего класса так что если кому будет необходим допилите под себя. Что бы функция начала работать необходимо передать первый параметр в виде: '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.: Функция только что была испечена так что является довольно сырой и не объезженной, возможны какие то баги. Функция при обработки вложенности использует рекурсию так что будьте осторожны когда будите обрабатывать этой функцией много тысячные массивы.
 
Ага забыл только сказать всем как ты вынес мозг себе мне и всем кто читал топик и в итоге после того как сделал понял что тебе оно не нужно. :facepalm:

пишется как $temp = $test_array[1]; тогда он выведет второе значение из массива - var222
Нужно читать что требуется а не на синтаксис смотреть.
Ему не переровнять нужно... Ему в этой переменной по сути адрес переменной нужен. Я ему говарил блин eval спасет мир. но нет же он чхать хотел на это... сделал как всегда по свойму... А потом меня ещё называет извращенцем рожденным под звездой абуфискации...
 
Ага забыл только сказать всем как ты вынес мозг себе мне и всем кто читал топик и в итоге после того как сделал понял что тебе оно не нужно. :facepalm:...
Да ладно тебе, не так уж оно было и страшно то.

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