вывод ссылок из mysql

Pegas

Новичок
вывод ссылок из mysql

Чет я загнался.. поможите написать функу для построения ссылок-переходов по каталогу

вид ссылок:

уровень1/уровень2/уровень3

в базе данные хранятся в таком виде:

level | id | idp | name

1|1|0|МЕТАЛЛ
2|2|1|АРМАТУРА
3|3|2|Арматура 6 мм
4|4|3|100100
4|5|3|1
4|6|3|23844.00
4|7|3|19870.00
3|8|2|Арматура 8 мм
4|9|8|100200
4|10|8|1
4|11|8|23064.00
4|12|8|19220.00
3|13|2|Арматура 10 мм
4|14|13|100300
4|15|13|1
4|16|13|21300.00
4|17|13|17750.00
2|18|1|БАЛКА
3|19|18|Балка №10
4|20|19|200100
4|21|19|0
4|22|19|10800.00
4|23|19|9000.00

буду очень признателен за помощь

-~{}~ 27.04.05 09:03:

видимо помощи не будет... :(
 

Pegas

Новичок
level - это глубина каталога, id - порядковый номер, idp - показывает принадлежность верхнему уровню, name - содержимое
 

SelenIT

IT-лунатик :)
Pegas
эта структура, если не ошибаюсь, зовется Adjacency List ;)

Тебе нужно построить только строку маршрута - все дерево строить не обязательно?

В любом случае, интересные мысли по теме недавно высказывались здесь. Там и ссылка есть...
 

SelenIT

IT-лунатик :)
так если дерево есть - все по идее вообще элементарно
пройтись циклом от конца маршрута к началу по убыванию вложенности...
а структура массива с деревом какая?
 

Pegas

Новичок
вот такая...
PHP:
    Array
(
    [0] => Array
        (
            [level] => 1
            [id] => 1
            [idp] => 0
            [text1] => МЕТАЛЛ

            [data] => 0
        )

    [1] => Array
        (
            [0] => Array
                (
                    [level] => 2
                    [id] => 2
                    [idp] => 1
                    [text1] => АРМАТУРА

                    [data] => 0
                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [level] => 3
                            [id] => 3
                            [idp] => 2
                            [text1] => Арматура 6 мм

                            [data] => 0
                        )

                    [1] => Array
                        (
                            [level] => 4
                            [id] => 4
                            [idp] => 3
                            [text1] => 100100

                            [data] => 0
                        )

                    [2] => Array
                        (
                            [level] => 4
                            [id] => 5
                            [idp] => 3
                            [text1] => 1

                            [data] => 0
                        )

                    [3] => Array
                        (
                            [level] => 4
                            [id] => 6
                            [idp] => 3
                            [text1] => 23844.00

                            [data] => 0
                        )

                    [4] => Array
                        (
                            [level] => 4
                            [id] => 7
                            [idp] => 3
                            [text1] => 19870.00

                            [data] => 0
                        )

                )
-~{}~ 27.04.05 14:19:

вот функа получилась, но она тока прыдущий уровень определяет.... опредилить ранее чет не получается... загнался...

PHP:
function title($out, $id_in)
  {
  foreach($out as $k=>$v)
    {
      if(isset($v[0]))
        {
        if ($v[0]["id"]==$id_in && $id_in!==0)
          echo $v[0]["text1"];
        if ($v[0]["id"]==$id_in || $id_in==0)
          break;
        unset($v[0]);
        title($v, $id_in);
        }
     }
  }
-~{}~ 27.04.05 17:19:

неужели нет ответа на мой вопрос???

-~{}~ 27.04.05 17:26:

сделал функу другим методом... но где-то закрался глюк - ссылки глючат, никак не найду ответ. поможите
PHP:
function title2($usertable, $level, $idp, $str)
  {
  if ($idp==0)
    $result=mysql_query("SELECT * FROM ".$usertable." WHERE idp=".$idp." ORDER BY text1;");
  else
    $result=mysql_query("SELECT * FROM ".$usertable." WHERE id=".$idp." ORDER BY text1;");
  if (!mysql_error())
    {
    while($mas=mysql_fetch_array($result, MYSQL_ASSOC))
      {
      if ($mas["idp"]==0)
        {
        if ($str=="")
          $str='<a href="'.$_SERVER['PHP_SELF'].'?idp='.$mas["idp"].'&level='.$mas["level"].'">'.$mas["text1"].'</a>';
        else
          $str='<a href="'.$_SERVER['PHP_SELF'].'?idp='.$mas["idp"].'&level='.$mas["level"].'">'.$mas["text1"].'</a> :: '.$str;
        echo $str;
        }
      else
        {
        if ($str=="")
          $str='<a href="'.$_SERVER['PHP_SELF'].'?idp='.$mas["idp"].'&level='.$mas["level"].'">'.$mas["text1"].'</a>';
        else
          $str='<a href="'.$_SERVER['PHP_SELF'].'?idp='.$mas["idp"].'&level='.$mas["level"].'">'.$mas["text1"].'</a> :: '.$str;
        $idp=$mas["idp"];
        title2($usertable, $level, $idp, $str);
        }
      }
    }
  else
    header("location: index.php?err=1");
  }
 

SelenIT

IT-лунатик :)
Pegas, протестируй такой вариант:
PHP:
function my_path($id,$elements) {
    static $path, $i, $ready;
    foreach ($elements as $k=>$element) {
        if (isset($element['id'])) { // нет подуровней
            $path[$element['level']] = $element['text1'];
            if ($element['id']==$id) {
            	$ready = 1;
            	for ($j=$element['level']+1;isset($path[$j]);$j++) {
            		unset($path[$j]); // чистка потенциального мусора из "чужих" ветвей
            	}
            }
        }
        else { // рекурсивно обходим подуровни
            my_path($id,$element);
        }
        if ($ready) {
        	return($path);
        }
    }
    return false;
}
P.S. В твоем примере похоже опечатка во вложенности - элементы 3-го и 4-го уровней почему-то оказались рядом...

А вообще обязательно делать структуру такой хитрой?
 

Pegas

Новичок
a как проще?

-~{}~ 28.04.05 08:46:

и точнее, как правильнее?

-~{}~ 28.04.05 09:02:

со структурой я опечатался, это точно

-~{}~ 28.04.05 13:57:

SelenIT Спасибо за функцию, добавил только формирование ссылок и все работает ок. Еще раз огромное спасибо.
 
Сверху