|
|
|
| Имеется дерево со след. структурой в базе (n = null)
1|1|n|n|n|n...
2|1|2|n|n|n...
3|1|2|3|n|n...
4|1|2|3|4|n...
*первый столбец - ид элемента, далее ид родителей, в конце также ид элемента
1
+-2
+---3
+-----4
помогите, плз, его отрисовать с помощью php | |
|
|
|
|
|
|
|
для: Валерий
(12.03.2007 в 23:41)
| | Смутное описание проблемы...
<?php
// в файле samp.txt записана структура
/*
1|1|n|n|n|n
2|1|2|n|n|n
3|1|2|3|n|n
4|1|2|3|4|n
*/
$matrix = file("samp.txt");
for ( $i = 0; $i < count($matrix); $i++ ) {
$matrix[$i] = explode("|", $matrix[$i]);
}
for ( $i = 0; $i < count($matrix); $i++ ) {
print "+";
$j = 0;
while( $matrix[$i][$j] !== "n" ) {
print "-";
$j++;
}
print $matrix[$i][$j - 1]."<br/>";
}
|
| |
|
|
|
|
|
|
|
для: Саня
(12.03.2007 в 23:56)
| | виноват :)
но код не работает, если база такая
1|1|n|n|n|n
2|1|2|n|n|n
3|1|2|3|n|n
4|1|2|3|4|n
5|5|n|n|n|n
6|5|6|n|n|n
7|7|n|n|n|n
8|8|n|n|n|n
что соответствует дереву
1
+-2
+---3
+-----4
5
+-6
7
8 | |
|
|
|
|
|
|
|
для: Валерий
(13.03.2007 в 00:02)
| | Может быть так?
<?
$matrix = file("samp.txt");
for ( $i = 0; $i < count($matrix); $i++ ) {
$matrix[$i] = explode("|", $matrix[$i]);
}
for ( $i = 0; $i < count($matrix); $i++ ) {
for ( $j = 0, $dash = ""; $j < count($matrix[$i]); $j++ ) {
if ( $matrix[$i][$j] == "n" || $j == count($matrix[$i]) - 1 ) {
if ( $j == 2 ) {
$dash = $matrix[$i][0];
} else {
$dash = "+" . substr($dash, 0, strlen($dash) - 2) . $matrix[$i][$j - 1];
}
break;
}
$dash .= "-";
}
print $dash."<br/>";
}
|
| |
|
|
|
|
|
|
|
для: Саня
(13.03.2007 в 00:26)
| | не совсем )) все было бы хорошо, если бы не такая конструкция
1|1|n|n|n|n
2|1|2|n|n|n
3|1|2|3|n|n
4|1|2|3|4|n
5|5|n|n|n|n
6|5|6|n|n|n
7|7|n|n|n|n
8|8|n|n|n|n
9|1|2|3|4|9
соответствующая дереву:
1
+-2
+-3
+-4
+-9
5
+-6
7
8
|
| |
|
|
|
|
|
|
|
для: Валерий
(13.03.2007 в 00:53)
| | лови скриптик
<?php
// получение "матрицы" данных
function GetData()
{
return file("tree.txt");
};
// построение массива деревца
function BuildTree(&$arr)
{
$ret = array();
foreach($arr as $key => $val)
{
$val = preg_replace("#(\|n)+#i", "", trim($val));
$tmp = explode("|", $val); $ind = intval($tmp[0]);
$ret[$ind] = 0;
if(count($tmp) > 2)
$ret[$ind] = intval($tmp[count($tmp)-2]);
unset($tmp);
};
return $ret;
};
// собственно вывод деревца
function EchoTree($tree, $prnt=0)
{
echo "\n<div>";
foreach($tree as $id => $prn)
{
if($prn !== $prnt)
continue;
echo "\n";
if ($prn == 0)
echo $id;
else
echo "+-".$id;
EchoTree($tree, $id);
};
echo "\n</div>";
};
$arr = GetData();
$itms = BuildTree(&$arr); unset($arr);
?>
<html><body>
<style>
div {padding-left:10px}
</style>
<?
EchoTree($itms); unset($itms);
?>
</body></html>
|
вот результаты тестов выше
матрица
1|1|n|n|n|n
2|1|2|n|n|n
3|1|2|3|n|n
4|1|2|3|4|n
вывод
1
+-2
+-3
+-4
|
матрица
1|1|n|n|n|n
2|1|2|n|n|n
3|1|2|3|n|n
4|1|2|3|4|n
5|5|n|n|n|n
6|5|6|n|n|n
7|7|n|n|n|n
8|8|n|n|n|n
вывод
1
+-2
+-3
+-4
5
+-6
7
8
|
матрица
1|1|n|n|n|n
2|1|2|n|n|n
3|1|2|3|n|n
4|1|2|3|4|n
5|5|n|n|n|n
6|5|6|n|n|n
7|7|n|n|n|n
8|8|n|n|n|n
9|1|2|3|4|9
вывод
1
+-2
+-3
+-4
+-9
5
+-6
7
8
|
матрица
2|1|2|n|n|n
3|1|2|3|n|n
4|1|2|3|4|n
5|5|n|n|n|n
6|5|6|n|n|n
7|7|n|n|n|n
8|8|n|n|n|n
9|1|2|3|4|9
10|5|10|n|n|n
11|7|11|n
вывод
1
+-2
+-3
+-4
+-9
5
+-6
+-10
7
+-11
8
|
| |
|
|
|
|
|
|
|
для: ZuArt
(13.03.2007 в 11:08)
| | ЗЫ. Чтение конфы вынес в отд. функцию, чтобы там можно было реализовать ЛЮБОЙ вариант запроса данных - на выходе должен быть массив строк - числа/n разделенные "|". В данном варианте - это файл "tree.txt".
Далее идет обработка данных с простой целью... т.к. имеем ДЕРЕВО, то получается, что непосредственный родительский элемент явлется единственным значимым, т.к. верхний уровень строится по непосредственному родителю и т.д.
Ну и для построения используется простая рекурсия и не более того... Основная "хитрость" сдвига кроется в том, что каждый уровень строится в слое (<div></div>) который имеет один существенный параметр padding-left:10px - это позволяет не заморачиваться с левыми отступами, т.к. сам вложенный слой будет "сдвинут" относительно родителя ;) | |
|
|
|