Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Дерево
 
 автор: Валерий   (12.03.2007 в 23:41)   письмо автору
 
 

Имеется дерево со след. структурой в базе (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:56)   письмо автору
 
   для: Валерий   (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/>";
}

   
 
 автор: Валерий   (13.03.2007 в 00:02)   письмо автору
 
   для: Саня   (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:26)   письмо автору
 
   для: Валерий   (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]) - ) {
      if ( 
$j == ) {
        
$dash $matrix[$i][0];
      } else {
        
$dash "+" substr($dash0strlen($dash) - 2) . $matrix[$i][$j 1];
      }
      break;
    }
    
$dash .= "-";
  }
  print 
$dash."<br/>";
}

   
 
 автор: Валерий   (13.03.2007 в 00:53)   письмо автору
 
   для: Саня   (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

   
 
 автор: ZuArt   (13.03.2007 в 11:08)   письмо автору
 
   для: Валерий   (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

вывод

 +-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

вывод

 +-2 
  +-3 
   +-4 

 +-6 

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

вывод

 +-2 
  +-3 
   +-4 
    +-9 

 +-6 

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

вывод

 +-2 
  +-3 
   +-4 
    +-9 

 +-6 
 +-10 

 +-11 
8

   
 
 автор: ZuArt   (13.03.2007 в 11:21)   письмо автору
 
   для: ZuArt   (13.03.2007 в 11:08)
 

ЗЫ. Чтение конфы вынес в отд. функцию, чтобы там можно было реализовать ЛЮБОЙ вариант запроса данных - на выходе должен быть массив строк - числа/n разделенные "|". В данном варианте - это файл "tree.txt".

Далее идет обработка данных с простой целью... т.к. имеем ДЕРЕВО, то получается, что непосредственный родительский элемент явлется единственным значимым, т.к. верхний уровень строится по непосредственному родителю и т.д.

Ну и для построения используется простая рекурсия и не более того... Основная "хитрость" сдвига кроется в том, что каждый уровень строится в слое (<div></div>) который имеет один существенный параметр padding-left:10px - это позволяет не заморачиваться с левыми отступами, т.к. сам вложенный слой будет "сдвинут" относительно родителя ;)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования