Переменный индекс массива

DDT

Новичок
Переменный индекс массива

Привет.

Есть автоматически формируемый массив типа:

Array
|
|-0
| |-1 = 'test'
|
|-1
|
|-2

Сложность в том, что заранее не известно на какую глубину массива надо обращаться.

Можно ли обратиться к элементу Array[0][1] подобным образом ?

PHP:
$index = '[0][1]';
${'Array'.$index} = 'test 2';
 

zerkms

TDD infected
Команда форума
Фaнaт
2 решения, причём с евалом оно короче (как бы ни было оно более "грязным")
бывают ещё?
 

leosun

Новичок
да можно обьявить массив обьектом и циклом ходить по нему =))) но это изврат

-~{}~ 18.07.08 16:53:

Моно так:

foreach ($fields as $f)
{
$r.="[$f]";
}


parse_str("var$r=$value", $var);
//Обращение к переменной производится так:
var_dump($var['var']);

//Если не указывать 2й параметр, то создастся перменна $var.
parse_str("var$r=$value");
//Обращение к переменной производится так:
var_dump($var);
 

DDT

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

Т.е. придется писать что-то вроде такого:
PHP:
eval('$Array'.$index.' = "test 2";');
А это неудобно :/
 

zerkms

TDD infected
Команда форума
leosun
зачем объектом? по массиву и так можно ходить через цикл
 

leosun

Новичок
Моно и так:

class CMy_array
{
var $array;
function CMy_array($array)
{
$this->array = array();

foreach ($array as $key=>$val)
{
if (is_array($val))
{
$this->array[$key] = new CMy_array($val);
}
else
{
$this->array[$key] = $val;
}
};
}
};


// $array - исходный массив
$root = new CMy_array($array);
// 1 раз, для создания структуры из изсходного массива


function change_val($root, $keysearch, $new_value)
{
$last_array = $root;
foreach ($keysearch as $keyval)
{
if (!is_object($last_array->array[$keyval]))
{
$last_array->array[$keyval] = $new_value;
}
else
{
$last_array = $last_array->array[$keyval];
}
}
};
 

leosun

Новичок
Автор оригинала: DDT
Да, евалом можно, но мне нужно работать с указанным элементом в данном массиве.

Т.е. придется писать что-то вроде такого:
PHP:
eval('$Array'.$index.' = "test 2";');
А это неудобно :/
Заверни в функцию

public function EditArrayValue($key,$value){
$patch = $this->ParsArray($this->site_map_array,'',$key);
eval('unset($this->site_map_array'.$patch.');');
$patch = str_replace("['$key']",'',$patch);
eval('$this->site_map_array'.$patch."[$value] = array();");
}

public function AddArrayKey($key,$value){
$patch = $this->ParsArray($this->site_map_array,'',$key);
eval('$this->site_map_array'.$patch."[$value] = array();");
}

public function DelArrayKey($key){
$patch = $this->ParsArray($this->site_map_array,'',$key);
eval('unset($this->site_map_array'.$patch.');');
}

public function ParsArray($ARR,$amp,$f_key){
foreach ($ARR as $key => $value){
if ($f_key === $key){
@$R.= $amp."['".$key."']";
}
if(is_array($value))$R.= $this->ParsArray($value,$amp."['".$key."']",$f_key);
}
return $R;
}
 

DDT

Новичок
Автор оригинала: zerkms
раньше думать надо было...
Спасибо! Я вот сейчас как раз и думаю. Как это сделать :)

-~{}~ 18.07.08 16:57:

Автор оригинала: leosun
Заверни в функцию

public function EditArrayValue($key,$value){
$patch = $this->ParsArray($this->site_map_array,'',$key);
eval('unset($this->site_map_array'.$patch.');');
$patch = str_replace("['$key']",'',$patch);
eval('$this->site_map_array'.$patch."[$value] = array();");
}

public function AddArrayKey($key,$value){
$patch = $this->ParsArray($this->site_map_array,'',$key);
eval('$this->site_map_array'.$patch."[$value] = array();");
}

public function DelArrayKey($key){
$patch = $this->ParsArray($this->site_map_array,'',$key);
eval('unset($this->site_map_array'.$patch.');');
}

public function ParsArray($ARR,$amp,$f_key){
foreach ($ARR as $key => $value){
if ($f_key === $key){
@$R.= $amp."['".$key."']";
}
if(is_array($value))$R.= $this->ParsArray($value,$amp."['".$key."']",$f_key);
}
return $R;
}
Если честно, то у меня была мысль писать свой обработчик массива, но я ее откладывал на последний случай :)

Думал, что можно с помощью ${} обойтись.
 

zerkms

TDD infected
Команда форума
leosun
учись:

PHP:
function blabla($array, $arg)
{
    $arg = substr($arg, 1, -1);
    $arg = explode('][', $arg);
    
    $res =& $array;
    
    foreach ($arg as $key) {
        if (!isset($res[$key])) {
            return null;
        }
        
        $res =& $res[$key];
    }
    
    return $res;
}

$array = array(1 => array(2 => array(3 => 'foobar')));

echo blabla($array, '[1][2][3]');
 

Фанат

oncle terrible
Команда форума
мля. leosun, исчезни из этого топика.

-~{}~ 18.07.08 17:07:

кстати да.
Откуда вообще может взяться необходимость обращаться к массиву подобным '[0][1]' образом?
 

DDT

Новичок
Автор оригинала: *****
мля. leosun, исчезни из этого топика.

-~{}~ 18.07.08 17:07:

кстати да.
Откуда вообще может взяться необходимость обращаться к массиву подобным '[0][1]' образом?
Данный массив - это иерархическое представление структуры документа
 

zerkms

TDD infected
Команда форума
DDT
представление - ладно. а вот откуда берётся сам аргумент '[0][1]'?
 

DDT

Новичок
Автор оригинала: zerkms
DDT
представление - ладно. а вот откуда берётся сам аргумент '[0][1]'?
[0][1] - это относительный адрес элемента в массиве.

Например, элемент document (т.е. сам документ) имеет адрес 0, вложенный в него элемент from будет иметь адрес [0][1] и т.д.
 

DDT

Новичок
Ermitazh
пишу фреймворк, для использования на различных платформах: PHP, Java, Cache

zerkms
исходный файл - это текстовый файл XML-подобного формата. В нем расположены теги для вызова элементов. Наподобие как в ASP.NET:
<asp:Label ... />

Хотя, я так думаю, что вариант использования массива тут изначально неверен. Думаю попробовать реализовать это на объектах.
 
Сверху