Вот скрипт :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Документ без названия</title>
</head>
<body>
<?php
$link = mysql_connect('localhost', 'root', '');
mysql_query("SET character_set_client = cp1251");
mysql_query("SET character_set_connection = cp1251");
mysql_query("SET character_set_results = cp1251");
mysql_select_db('mycms', $link);
#
$sql_get_hdrs = mysql_query("SELECT id, title FROM site_pages WHERE owner_id IS NULL");
#
while ($assoc_pgs = mysql_fetch_assoc($sql_get_hdrs)) {//W1 start l1
$id_pgs = $assoc_pgs['id'];
$title_pgs = $assoc_pgs['title'];
#
echo '<b><label style="color:#09F;">'.$title_pgs.'</label></b><br />';
#
# #
#
while ($e3 != 404) {//W3 start l2
$sql_get_child = mysql_query("SELECT id, title, level FROM site_pages WHERE owner_id = '$id_pgs'");
$count_get_chld = mysql_num_rows($sql_get_child);
#
if ($count_get_chld > 0) {
while ($assoc_chlds = mysql_fetch_assoc($sql_get_child)) {//W2 start l3
$id_chld = $assoc_chlds['id'];
$title_chld = $assoc_chlds['title'];
echo ' '.$title_chld.'<br />';
$sql_get_ch2 = mysql_query("SELECT id, title, level FROM site_pages WHERE owner_id = '$id_chld'");
$count_get_ch2 = mysql_num_rows($sql_get_ch2);
if ($count_get_ch2 > 0) {
while ($assoc_ch2 = mysql_fetch_assoc($sql_get_ch2)) {//W4 start l4
$title_ch2 = $assoc_ch2['title'];
$id_ch2 = $assoc_ch2['id'];
echo ' '.$title_ch2.'<br />';
$sql_get_ch3 = mysql_query("SELECT id, title, level FROM site_pages WHERE owner_id = '$id_ch2'");
$count_get_ch3 = mysql_num_rows($sql_get_ch3);
if ($count_get_ch3 > 0) {
while ($assoc_ch3 = mysql_fetch_assoc($sql_get_ch3)) {//W5 start l5
$title_ch3 = $assoc_ch3['title'];
$id_ch3 = $assoc_ch3['id'];
echo ' '.$title_ch3.'<br />';
$sql_get_ch4 = mysql_query("SELECT id, title, level FROM site_pages WHERE owner_id = '$id_ch3'");
$count_get_ch4 = mysql_num_rows($sql_get_ch4);
if ($count_get_ch4 > 0) {
while ($assoc_ch4 = mysql_fetch_assoc($sql_get_ch4)) {//W6 start l6
$title_ch4 = $assoc_ch4['title'];
echo ' '.$title_ch4.'<br />';
}//W6 end
}
}//W5 end
}
}//W4 end
}
}//W2 end
break;
} else {
break;
}
#
}//W3 end
}//W1 end
#
@mysql_close($link);
?>
</body>
</html>
Вот дамп БД :
-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Nov 14, 2010 at 02:06 PM
-- Server version: 5.5.0
-- PHP Version: 5.3.3
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Database: `mycms`
--
-- --------------------------------------------------------
--
-- Table structure for table `site_pages`
--
CREATE TABLE IF NOT EXISTS `site_pages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` text NOT NULL,
`content` text,
`owner_id` int(11) DEFAULT NULL,
`level` int(11) DEFAULT '1',
`updated` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=11 ;
--
-- Dumping data for table `site_pages`
--
INSERT INTO `site_pages` (`id`, `title`, `content`, `owner_id`, `level`, `updated`) VALUES
(1, 'Главная страница', 'Главная страница О_о^^', NULL, 1, '2010-11-12 10:06:42'),
(2, 'Новости', 'Пыщь пыщь новости хдд', 1, 2, '2010-11-13 13:52:59'),
(3, 'Объявления', 'Объявить да хдд ололо пыщь пыщь', 1, 2, '2010-11-13 11:16:54'),
(4, 'Форум', 'Форумэ ололо хддд !11111', NULL, 1, '2010-11-13 11:17:30'),
(5, 'Обсуждения', 'Царапэ атец11111', 4, 2, '2010-11-13 11:18:44'),
(6, 'Голосование', 'Пыщь голосэ', 4, 2, '2010-11-13 13:34:58'),
(7, 'Флудильня', 'Флудэ хдд ололололоол', 4, 2, '2010-11-13 13:41:59'),
(8, '13.11.2010 Пцц туплю да', '!1111', 2, 3, '2010-11-13 14:43:14'),
(9, 'Часть 1', 'выавыа', 8, 4, '2010-11-14 14:52:35'),
(10, 'х1', 'ололо', 9, 5, '2010-11-14 15:00:16');
Суть скрипта состоит в следующем :
Получаем из базы список страниц, если поле owner_id пустое - значит это заголовок, под ним выводим его дочерние поля.
owner_id - это идентификатор поля, под который должно располагаться это поле(родитель).
id - идентификатор поля.
title - заголовок.
level - уровень.
Нужно вывести все эти строки и построить дерево каталогов. Скрипт работает, дерево создаётся, но если вдруг вложенность будет просто огромная, то не стану же я добавлять до бесконечности циклы и отправлять запросы к бд в миллион строк, а строки могут записаны в базе не по порядку.
Со вчерашнего дня ломаю голову, помогите упростить, пожалуйста).
Спустя 14 минут, 46 секунд (14.11.2010 - 16:36) Sanchopansa написал(а):
<?php
$arr = array(
array(
'name_r' => 'Категория 1',
'id' => 1,
'parent' => 0
),
array(
'name_r' => 'Категория 2',
'id' => 2,
'parent' => 0
),
array(
'name_r' => 'Категория 3',
'id' => 3,
'parent' => 0
),
array(
'name_r' => 'Подкатегория 1',
'id' => 4,
'parent' => 1
),
array(
'name_r' => 'Подкатегория 2',
'id' => 5,
'parent' => 1
),
array(
'name_r' => 'Подкатегория 3',
'id' => 6,
'parent' => 3
),
array(
'name_r' => 'Подподкатегория 4',
'id' => 7,
'parent' => 6
),
array(
'name_r' => 'Подподкатегория 5',
'id' => 8,
'parent' => 4
)
);
function getTree($arr, $parent = 0, $rotation = 0)
{
$space = '';
$tmp_rot = $rotation;
while ($tmp_rot)
{
$space .= '-';
$tmp_rot--;
}
foreach ($arr as $cat){
if ($cat['parent'] == $parent)
{
echo $space.$cat['name_r'] . "\n\r";
getTree(&$arr, $cat['id'], $rotation+1);
}
}
}
getTree($arr);
?>
вот подумай над этим
Спустя 3 минуты, 8 секунд (14.11.2010 - 16:39) walters написал(а):
ты выбрал самые длинные пути? зачем едешь в центр на трамвае когда пешком короче и быстрее?
Спустя 7 минут, 52 секунды (14.11.2010 - 16:47) htaccess написал(а):
Цитата (walters @ 14.11.2010 - 13:39) |
ты выбрал самые длинные пути? зачем едешь в центр на трамвае когда пешком короче и быстрее? |
Ну чтож, подскажите или дайте самокат)
Спустя 1 минута, 19 секунд (14.11.2010 - 16:48) htaccess написал(а):
Цитата (Sanchopansa @ 14.11.2010 - 13:36) |
<?php вот подумай над этим |
Спасибо, испробую)
Спустя 5 минут, 34 секунды (14.11.2010 - 16:53) htaccess написал(а):
Но ведь там все не по порядку будет, скрин из базы прикрепил в первом посте.
Спустя 2 часа, 30 минут, 43 секунды (14.11.2010 - 19:24) Sanchopansa написал(а):
<?php
function getTree($arr, $parent = 0, $rotation = 0)
{
$space = '';
$tmp_rot = $rotation;
while ($tmp_rot)
{
$space .= '-';
$tmp_rot--;
}
foreach ($arr as $cat){
if ($cat['owner_id'] == $parent)
{
if($cat['owner_id'] === null)
{
$cat['title'] = '<h1>' . $cat['title'] . '</h1>';
}
echo $space.$cat['title'] . "<br />";
getTree(&$arr, $cat['id'], $rotation+1);
}
}
}
$result = mysql_query("SELECT * FROM site_pages ORDER BY id ASC");
$arr = array();
while ($row = mysql_fetch_assoc($result))
{
$arr[] = $row;
}
getTree($arr, null);
Вот короче сделай так и на выходе получишь такое дерево
Цитата |
Главная страница -Новости --13.11.2010 Пцц туплю да ---Часть 1 ----х1 -Объявления Форум -Обсуждения -Голосование -Флудильня |
Спустя 2 часа, 52 минуты, 17 секунд (14.11.2010 - 22:16) htaccess написал(а):
Цитата (Sanchopansa @ 14.11.2010 - 16:24) | ||
<?php Вот короче сделай так и на выходе получишь такое дерево
|
Конечно работает, спасибо) Пробую.