Многомерный массив

eXed

Guest
Многомерный массив

задача:
есть два массива root, child:
PHP:
$root=array(1,2,3,4,5,7);
$child=array(0,1,1,3,4,1);
----
1:0
2:1
3:1
4:3
5:4
7:1
----
из них нужно составить многомерный ассоциативный массив:
PHP:
$out_ar = array([0]=>array([1]=>array([2]=>, [3]=>array([4]=>array([5]=>)), [7]=>)));
значение child массива соответствует значению из руут его родителя

конечная задача:
вывод дерева, типа "эксплорер":
1-
+2
+3|
| +4|
| +5
+7
--------

-~{}~ 10.02.04 17:04:

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

гоша

Guest
насколько я понял вопрос

PHP:
$parent=array(1,1,1,2,3,3,3,7);
$child =array(2,3,4,5,6,7,8,9);

$tree=array();
$ref=array();

foreach($parent as $k=>$v){
	$c=$child[$k];
	if(!isset($ref[$v])){
		$tree[$v]=array();
		$ref[$v]=&$tree[$v];
	}
	$ref[$v][$c]=array();
	$ref[$c]=&$ref[$v][$c];
}

print_r($tree);
 

eXed

Guest
прошу прощения, если не точно описал. но смысл маленько в другом.
гум. аспект.
требуется создать древовидное меню:
БД структура:
поле id уникально.
0 - самый высокий уровень в иерархии меню.
[id] [name] [root]
1 главная 0
2 новости 1
3 статьи 1
4 архив 1
5 2003 4
6 январь 5
7 февраль 5
и т.д.
масссив по которому будет лепиться ХТМЛ код должен выглядеть так.
array([0]=>array([2]=>, [3]=>, [4]=>array([5]=>array([6]=>,[7]=>))));
 

Линк

Guest
можно еще рекурсивной ф-ией
тоесть ф-яя получает массив первого уровня
выводит все его элементы, а потом на каждый (который являецца массивом) натравляет сама себя

при этом увеличивая некую переменную, дабы считать уровни глубины
 

eXed

Guest
гоша огромное спасибо, опять стормозил - поторопился.

не понял, только как убрать лишние Array(), чтобы в дальнейшем не проверять кей на размер, а использовать is_array($key).

Array ( [0] => Array ( [1] => Array ( [2] => Array ( ) [3] => Array ( [4] => Array ( [5] => Array ( ) ) [7] => Array ( ) ) [6] => Array ( ) [8] => Array ( ) ) ) )
PHP:
$parent= array(0,1,1,3,4,1,3,1);
$child = array(1,2,3,4,5,6,7,8);


 for($i = 0; $i < count($parent); $i++){

  echo $child[$i].":".$parent[$i]."<br>";
}

$tree=array();
$ref=array();

foreach($parent as $k=>$v){
    $c=$child[$k];
    if(!isset($ref[$v])){
        $tree[$v]= null;// array();
        $ref[$v]=&$tree[$v];
    }
    $ref[$v][$c]= array();
    $ref[$c]=&$ref[$v][$c];
}
 

гоша

Guest
а зачем тебе их убирать? Наоборот, удобно:

PHP:
function out($t){
	foreach($t as $k=>$v){
		print "<li>$k</li><ul>";
		out($v);
		print "</ul>";
	}
}

out($tree);
и никаких проверок не надо.
 

eXed

Guest
гоша подумал и согласился:) - туда еще можно загнать значения
-- еще раз огромное спасибо - очень красивый и функциональный код. Сдвиг с мертвой точки.
 
Сверху