PHP статьи и уроки
Приветствую Вас, Гость!

Меню
Интересное:
Реклама:
Смотрю "Записки о MacBook и Mac OS", в блоге gamedev программиста.
Главная » Статьи » Статьи » PHP и базы данных

Построение дерева иерархии с помощью PHP / MySQL
Рассмотрим пример построения дерева иерархии (в развернутом виде) на основе информации из базы данных с помощью PHP и MySQL. Ключ к решению данной задачи - использование рекурсивной функции. Иерархия разделов будет храниться в таблице базы данных MySQL.

Ниже на скриншоте показана данная таблица (catalogue):


  • id - первичный ключ таблицы
  • pid - id родительского раздела

Далее напишем следующий PHP-скрипт:

1. Файл dbopen.php (открывает соединение с MySQL)

php
$hostName
= "";
$userName = "yura";
$password = "yura";
$databaseName = "tree";
if (!(
$link=mysql_connect($hostName,$userName,$password))) {
printf("Ошибка при соединении с MySQL !\n");
exit();
}
if (!
mysql_select_db($databaseName, $link)) {
printf("Ошибка базы данных !");
exit();
}
?>

2. Файл index.php (основной скрипт)

php
include( "dbopen.php" );

function
ShowTree($ParentID, $lvl) {

global
$link;
global
$lvl;
$lvl++;

$sSQL="SELECT id,title,pid FROM catalogue WHERE pid=".$ParentID." ORDER BY title";
$result=mysql_query($sSQL, $link);

if (
mysql_num_rows($result) > 0) {
echo(
"
    \n");
    while (
    $row = mysql_fetch_array($result) ) {
    $ID1 = $row["id"];
    echo(
    "
  • \n");
    echo(
    "?ID=".$ID1."\">".$row["title"].""." \n");
    ShowTree($ID1, $lvl);
    $lvl--;
    }
    echo(
    "
\n"
);
}

}

ShowTree(0, 0);

mysql_close($link);

?>

Всю работу выполняет рекурсивная функция ShowTree(). Ниже на скриншоте показан пример работы index.php:



Источник: http://codnet.ru, internet-technologies.ru
Категория: PHP и базы данных | Добавил: PHP (22.03.2008)
Просмотров: 5909 | Комментарии: 3
Всего комментариев: 3
3  
Alexandr прав в качестве эксперимента для новичков, но не более!
Этот скрипт убог так как каждый запрос замедляет программу, а если дерево будет из миллиона строк, допустим дерево типа "друзья друзей"?
А если к сайту будут обращаться тысячи пользователей как к сайту вконтакте?
Сервак не выдержит нагрузки! Вот за такое руки отрубывать нужно...
Не терпится увидеть пример без кучи запросов, держите:

function getByParentID(&$array, $parentid) {
$res = array();
foreach($array as $value)
if($value['pid'] == $parentid)
$res[] = $value;
if(count($res))
return $res;
else
return false;
}

function InsertbyID(&$array, $parentid = "") {
$gr = getByParentID($array, $parentid);
print_r($gr); //Выводит значение
foreach($gr as $value) {
InsertbyID($array, $value['id']);
}

Не самое быстрое но работает со смешанными массивами


2  
А мне вот интересно и тем более как раз пригодился скрипт. Сам то родился с таким знанием что-ли, а то нахватаются инфы и мнят себя вундеркиндами. Если такой умный то чего сам не придумал "быстродействующее решение для выборки из этого массива, без бесконечных циклов". Умник хренов!

1  
Такое решение на столько очевидно, что излагать его - в пустую тратить время свое и читающих. Было бы интересно почитать если бы обошлось 1 запросом к бд (запись структуры в массив) , и придумать быстродействующее решение для выборки из этого массива, без бесконечных циклов.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Copyright Viktor L.P. © 2017 Бесплатный конструктор сайтов - uCoz
down
Построение дерева иерархии с помощью PHP / MySQL - PHP и базы данных - Статьи - Статьи, уроки - Уроки и статьи по PHP
Главная » Статьи » Статьи » PHP и базы данных

Построение дерева иерархии с помощью PHP / MySQL
Рассмотрим пример построения дерева иерархии (в развернутом виде) на основе информации из базы данных с помощью PHP и MySQL. Ключ к решению данной задачи - использование рекурсивной функции. Иерархия разделов будет храниться в таблице базы данных MySQL.

Ниже на скриншоте показана данная таблица (catalogue):


  • id - первичный ключ таблицы
  • pid - id родительского раздела

Далее напишем следующий PHP-скрипт:

1. Файл dbopen.php (открывает соединение с MySQL)

php
$hostName
= "";
$userName = "yura";
$password = "yura";
$databaseName = "tree";
if (!(
$link=mysql_connect($hostName,$userName,$password))) {
printf("Ошибка при соединении с MySQL !\n");
exit();
}
if (!
mysql_select_db($databaseName, $link)) {
printf("Ошибка базы данных !");
exit();
}
?>

2. Файл index.php (основной скрипт)

php
include( "dbopen.php" );

function
ShowTree($ParentID, $lvl) {

global
$link;
global
$lvl;
$lvl++;

$sSQL="SELECT id,title,pid FROM catalogue WHERE pid=".$ParentID." ORDER BY title";
$result=mysql_query($sSQL, $link);

if (
mysql_num_rows($result) > 0) {
echo(
"
    \n");
    while (
    $row = mysql_fetch_array($result) ) {
    $ID1 = $row["id"];
    echo(
    "
  • \n");
    echo(
    "?ID=".$ID1."\">".$row["title"].""." \n");
    ShowTree($ID1, $lvl);
    $lvl--;
    }
    echo(
    "
\n"
);
}

}

ShowTree(0, 0);

mysql_close($link);

?>

Всю работу выполняет рекурсивная функция ShowTree(). Ниже на скриншоте показан пример работы index.php:



Источник: http://codnet.ru, internet-technologies.ru
Категория: PHP и базы данных | Добавил: PHP (22.03.2008)
Просмотров: 5909 | Комментарии: 3
Всего комментариев: 3
3  
Alexandr прав в качестве эксперимента для новичков, но не более!
Этот скрипт убог так как каждый запрос замедляет программу, а если дерево будет из миллиона строк, допустим дерево типа "друзья друзей"?
А если к сайту будут обращаться тысячи пользователей как к сайту вконтакте?
Сервак не выдержит нагрузки! Вот за такое руки отрубывать нужно...
Не терпится увидеть пример без кучи запросов, держите:

function getByParentID(&$array, $parentid) {
$res = array();
foreach($array as $value)
if($value['pid'] == $parentid)
$res[] = $value;
if(count($res))
return $res;
else
return false;
}

function InsertbyID(&$array, $parentid = "") {
$gr = getByParentID($array, $parentid);
print_r($gr); //Выводит значение
foreach($gr as $value) {
InsertbyID($array, $value['id']);
}

Не самое быстрое но работает со смешанными массивами


2  
А мне вот интересно и тем более как раз пригодился скрипт. Сам то родился с таким знанием что-ли, а то нахватаются инфы и мнят себя вундеркиндами. Если такой умный то чего сам не придумал "быстродействующее решение для выборки из этого массива, без бесконечных циклов". Умник хренов!

1  
Такое решение на столько очевидно, что излагать его - в пустую тратить время свое и читающих. Было бы интересно почитать если бы обошлось 1 запросом к бд (запись структуры в массив) , и придумать быстродействующее решение для выборки из этого массива, без бесконечных циклов.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]