PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Страниц (4): « 1 2 [3] 4 »
Найдено сообщений: 53
Saymor
Отправлено: 20 Октября, 2012 - 23:12:15 • Тема: Многомерный массив • Форум: Напишите за меня, пожалуйста
Ответов: 14 Просмотров: 105
Здравствуйте!
в БД в одной таблице есть данные, типа:
type ="category",
type ="object",
type ="img"
понятно, что у записей уникальные id и категорий много так же как объектов и фото.
связь между ними осуществляется по полю "cat", например (цветом выделил связи, для простоты восприятия):
Категория 1 - 'id '=1 , 'cat '=0;
объект 1 - 'id '=9 , 'cat '=1 ;
объект 2 - 'id '=10 , 'cat '=1 ;
картинка 1 - 'id '=19, 'cat '=9 ;
картинка 2 - 'id '=20, 'cat '=9 ;
картинка 3 - 'id '=22, 'cat '=9 ;
картинка 1 - 'id '=22, 'cat '=10 ;
суть в том, что надо вывести данные в виде:
-категория 1
--объект 1
---фото 1
---фото 2
---фото (n)
вот не могу понять, как сформировать правильный массив для вывода?
Saymor
Отправлено: 13 Июля, 2011 - 23:19:12 • Тема: Вывод древовидной структуры из БД • Форум: Работа с СУБД
Ответов: 23 Просмотров: 8597
Господа!
так кто подскажет как сделать последние дочерние элементы ссылками??
(Добавление)
походу один я batman
решение на свой вопрос нашел сам!
вот решение:
PHP:
скопировать код в буфер обмена
<?PHP
// делаем запрос
$cats = "SELECT id,name,parent FROM category" ;
// создаем многомерный массив
for ( $i = 0
, $n = count ( $cats ) ; $i < $n ; $i ++ ) { $cat = $cats [ $i ] ;
if ( empty ( $tree [ $cat -> parent ] ) ) $tree [ $cat -> parent ] = array ( ) ; $tree [ $cat -> parent ] [ ] = $cat ;
}
// вызываем рекурсивную функцию, передаём ей массив
ShowCategory( $tree ) ;
// создаём рекурсивную функцию
function ShowCategory( & $tree , $k_parent = 0, $count = 0 ) { // добавляем $count
#########################
if ( empty ( $tree [ $k_parent ] ) ) return ; ## НЕ ВИЖУ СМЫСЛА В ДАННОЙ СТРОКЕ ## ТАК КАК И БЕЗ НЕЁ ВСЕ РАБОТАЕТ, А ВЫ КАК ДУМАЕТЕ?
// выводим дерево
echo $k_parent ? "<ul>" : "" ;
for ( $i = 0
, $n = count ( $tree [ $k_parent ] ) ; $i < $n ; $i ++ ) {
####### Добавляем строчку кода, которая считает кол-во конечных потомков
@ $count = count ( $tree [ $tree [ $k_parent ] [ $i ] -> id ] ) ; ######################################################
echo "<li>" ;
##########################
if ( $count ) { // если $count==0, то даем ссылку иначе <span>
##########################
echo "<span>" . $tree [ $k_parent ] [ $i ] -> name . "</span>" ;
} else {
echo "<a href='index.php?category=" . $tree [ $k_parent ] [ $i ] -> id . "'>" . $tree [ $k_parent ] [ $i ] -> p_name . "</a>" ;
}
// функция вызывает сама себя с массивом $tree и $tree[$k_parent][$i]->id родителя
ShowCategory( $tree , $tree [ $k_parent ] [ $i ] -> id , $count ) ; // добавляем $count
echo "</li>" ;
}
echo $k_parent ? "</ul>" : "" ;
} ?>
прокомментируйте моё решение, может есть что-то более изящное?
Saymor
Отправлено: 13 Июля, 2011 - 17:47:04 • Тема: Вывод древовидной структуры из БД • Форум: Работа с СУБД
Ответов: 23 Просмотров: 8597
OrmaJever пишет: $q = mysql_query('SELECT id,name,parent FROM category');
$arr = array();
while($ob = mysql_fetch_object($q)) {
$arr[$ob->id] = array('parent' => $ob->parent, 'name' => $ob->name);
}
// вызываем рекурсивную функцию, передаём ей массив
ShowCategory($arr, 0);
// создаём рекурсивную функцию
function ShowCategory(&$arr, $parent = 0){
// выводим дерево
echo "<ul>";
foreach($arr as $k => $v) {
echo "<li>";
if($v['parent'] != $parent) continue;
echo "<a href='index.php?category=".$k."'>".$v['name']."</a>";
ShowCategory($arr, $k);
echo "</li>";
}
echo "</ul>";
}
работает не совсем так как мне надо..
Saymor
Отправлено: 12 Июля, 2011 - 21:16:34 • Тема: Вывод древовидной структуры из БД • Форум: Работа с СУБД
Ответов: 23 Просмотров: 8597
Мелкий пишет: isset($tree[$id])
хм.. а где вы взяли из моего примера $id ?
я попробовал
и
и
однако условие выполняется не так как нужно
ещё советы?
Saymor
Отправлено: 12 Июля, 2011 - 14:54:52 • Тема: Вывод древовидной структуры из БД • Форум: Работа с СУБД
Ответов: 23 Просмотров: 8597
OrmaJever пишет: Да это так но не факт что с вариант с масивом будет лутше.
Цыкл который делает этот масив потянет время + если неограниченая вложеность то сам масив потянет большую память.
ну даже не знаю что сказать!
в целом массив кэшировать можно, так же как и запросы к БД,,,,
Однако читал, что 1 запрос лучше. Не думаю что массив нагнет сервак больше чем множественные запросы к БД..
Saymor
Отправлено: 12 Июля, 2011 - 13:59:35 • Тема: Вывод древовидной структуры из БД • Форум: Работа с СУБД
Ответов: 23 Просмотров: 8597
OrmaJever пишет: нет тема какраз таки затрагивает бд. Вы просто изначально не верно написали.
PHP:
скопировать код в буфер обмена
<?PHP
// вызываем рекурсивную функцию, передаём ей массив
ShowCategory(0);
// создаём рекурсивную функцию
function ShowCategory($parent = 0){
$q = mysql_query("SELECT id,name,parent FROM category WHERE parent = $parent");
if(mysql_num_rows($q) == 0) return;
// выводим дерево
echo "<ul>";
while($ob = mysql_fetch_object($q)) {
echo "<li>";
echo "<a href='index.php?category=".$ob->id."'>".$ob->name."</a>";
ShowCategory($ob->id);
echo "</li>";
}
echo "</ul>";
}
?>
Вроде верно, но мог и гдето ошибится
хм. Ваш подход ведет к множеству запросов к БД, а это не приемлемо если у нас дерево неограниченной вложенности.
Мой код в начале темы делает всего 1 запрос к БД, далее работаем только с массивом, сортируя его так чтоб вышло дерево.. и все работает, вот только с условием беда...
с выводом ссылки конечного потомка
Saymor
Отправлено: 12 Июля, 2011 - 13:08:43 • Тема: Вывод древовидной структуры из БД • Форум: Работа с СУБД
Ответов: 23 Просмотров: 8597
DeepVarvar пишет: Что-то типа:
CODE (SQL):
скопировать код в буфер обмена
SELECT * FROM category ORDER BY id ASC GROUP BY parent
спасибо, но это НЕ то....
Мне кажется модераторы перенесли тему не в ту степь!
Тема моего сообщения затрагивает "Рекурсию", а не БД!
Saymor
Отправлено: 12 Июля, 2011 - 08:11:44 • Тема: Вывод древовидной структуры из БД • Форум: Работа с СУБД
Ответов: 23 Просмотров: 8597
вывод данных из БД в виде дерева
есть БД
| id |--------| parent |--------| name |
+----+--------+--------+--------+------------+
| 1 |--------| 0 |--------| Родитель 1 |
| 2 |--------| 0 |--------| Родитель 2 |
| 3 |--------| 0 |--------| Родитель 3 |
| 4 |--------| 0 |--------| Родитель 4 |
| 5 |--------| 0 |--------| Родитель 5 |
| 6 |--------| 0 |--------| Родитель 6 |
| 11 |--------| 1 |--------| Потомок 1 |
| 12 |--------| 1 |--------| Потомок 2 |
| 13 |--------| 2 |--------| Потомок 1 |
| 14 |--------| 13 |--------| Потомок 1 |
| 15 |--------| 13 |--------| Потомок 2 |
выводим данные из БД
PHP:
скопировать код в буфер обмена
<?PHP
// делаем запрос
$cats = "SELECT id,name,parent FROM category" ;
// создаем многомерный массив
for ( $i = 0
, $n = count ( $cats ) ; $i < $n ; $i ++ ) { $cat = $cats [ $i ] ;
if ( empty ( $tree [ $cat -> parent ] ) ) $tree [ $cat -> parent ] = array ( ) ; $tree [ $cat -> parent ] [ ] = $cat ;
}
// вызываем рекурсивную функцию, передаём ей массив
ShowCategory( $tree ) ;
// создаём рекурсивную функцию
function ShowCategory( & $tree , $k_parent = 0) {
if ( empty ( $tree [ $k_parent ] ) ) return ;
// выводим дерево
echo $k_parent ? "<ul>" : "" ;
for ( $i = 0
, $n = count ( $tree [ $k_parent ] ) ; $i < $n ; $i ++ ) { echo "<li>" ;
if ( ??????? кое условие ?????????) { // здесь суть моего вопроса
echo "<span>" . $tree [ $k_parent ] [ $i ] -> name . "</span>" ;
} else {
echo "<a href='index.php?category=" . $tree [ $k_parent ] [ $i ] -> id . "'>" . $tree [ $k_parent ] [ $i ] -> p_name . "</a>" ;
}
// функция вызывает сама себя с массивом $tree и $tree[$k_parent][$i]->id родителя
ShowCategory( $tree , $tree [ $k_parent ] [ $i ] -> id ) ;
echo "</li>" ;
}
echo $k_parent ? "</ul>" : "" ;
} ?>
Пожалуйста помогите создать условие.
поясню: в результате самый последний потомок должен быть ссылкой, любой родитель нет.
Saymor
Отправлено: 07 Июля, 2011 - 09:34:15 • Тема: Вывод древовидной структуры из БД • Форум: SQL и Архитектура БД
Ответов: 3 Просмотров: 29
данные в БД
| id |-----| parent |----------| Name |
+--+----+--------+---------+--------+
| 1 |-----| 0 |-----------------| Родитель 1 |
| 2 |-----| 0 |-----------------| Родитель 2 |
| 3 |-----| 0 |-----------------| Родитель 3 |
| 4 |-----| 0 |-----------------| Родитель 4 |
| 5 |-----| 0 |-----------------| Родитель 5 |
| 6 |-----| 0 |-----------------| Родитель 6 |
|11|-----| 1 |-----------------| Потомок 1.1 |
|12|-----| 1 |-----------------| Потомок 1.2 |
|13|-----| 2 |-----------------| Потомок 1.1 |
|14|-----|13|-----------------| Потомок 1.1.1 |
|15|-----|13|-----------------| Потомок 1.1.2 |
Запрос к БД:
результат, имеем массив в таком виде:
CODE (
htmlphp ):
скопировать код в буфер обмена
(
[ 0 ] => stdClass Object
(
[ id] => 1
[ name] => Родитель 1
[ parent] => 0
)
[ 1 ] => stdClass Object
(
[ id] => 14
[ name] => Потомок 1. 1. 1
[ parent] => 13
)
[ 2 ] => stdClass Object
(
[ id] => 13
[ name] => Потомок 1. 1
[ parent] => 2
)
[ 3 ] => stdClass Object
(
[ id] => 11
[ name] => Потомок 1. 1
[ parent] => 1
)
[ 4 ] => stdClass Object
(
[ id] => 12
[ name] => Потомок 1. 2
[ parent] => 1
)
[ 5 ] => stdClass Object
(
[ id] => 15
[ name] => Потомок 1. 1. 2
[ parent] => 13
)
[ 6 ] => stdClass Object
(
[ id] => 2
[ name] => Родитель 2
[ parent] => 0
)
[ 7 ] => stdClass Object
(
[ id] => 3
[ name] => Родитель 3
[ parent] => 0
)
[ 8 ] => stdClass Object
(
[ id] => 4
[ name] => Родитель 4
[ parent] => 0
)
[ 9 ] => stdClass Object
(
[ id] => 5
[ name] => Родитель 5
[ parent] => 0
)
[ 10 ] => stdClass Object
(
[ id] => 6
[ name] => Родитель 6
[ parent] => 0
)
)
далее вывожу так:
PHP:
скопировать код в буфер обмена
<?
for ( $i = 0
, $n = count ( $cats ) ; $i < $n ; $i ++ ) { $cat = $cats [ $i ] ;
if ( empty ( $tree [ $cat -> parent ] ) ) $tree [ $cat -> parent ] = array ( ) ; $tree [ $cat -> parent ] [ ] = $cat ;
}
ShowCategory( $tree ) ;
function ShowCategory( & $tree , $k_parent = 0) {
if ( empty ( $tree [ $k_parent ] ) ) return ;
echo $k_parent ? "<ul style='display:none;'>" : "<ul>" ;
for ( $i = 0
, $n = count ( $tree [ $k_parent ] ) ; $i < $n ; $i ++ ) {
echo "<li>" ;
if ( ??????= Здесь должно быть условие= ????????) {
echo "<span>" . $tree [ $k_parent ] [ $i ] -> p_name . "</span>" ;
} else {
echo "<a href='index2.php?category=" . $tree [ $k_parent ] [ $i ] -> id . "'>" . $tree [ $k_parent ] [ $i ] -> p_name . "</a>" ;
}
ShowCategory( $tree , $tree [ $k_parent ] [ $i ] -> id ) ;
echo "</li>" ;
}
echo $k_parent ? "</ul>" : "" ;
}
?>
а суть условия такова: надо сделать самого последнего потомка ссылкой.
помогите добрым советом?
Saymor
Отправлено: 18 Мая, 2011 - 13:11:36 • Тема: ul li: перенос строки • Форум: HTML, Дизайн & CSS
Ответов: 7 Просмотров: 8747
DeepVarvar пишет: Вот вы там наковыряли...
Щас набросаю...
(Добавление)
<style>
ul#pathway { width: 100%;}
ul#pathway li {display: inline; list-style: none; height: 20px; border: dotted 1px #d0d0d0;}
</style>
<ul id="pathway">
<li><a href="#">Молодую обезьяну-шимпанзе сажали в закрытый ящик и по чисто павловской процедуре</a></li>
<li><a href="#">Со временем эта картина меняется, поскольку потребность, о которой идет речь, преобразуется</a></li>
<li><a href="#">Исследования показали, что уже в первые часы жизни дети реагируют на зрительные</a></li>
<li><a href="#">Потребность в социальных контактах, или в общении, остается одной из ведущих у человека</a></li>
</ul>
вот теперь работает, такой код накрутили до меня.
Вы мне уже 2 раз очень сильно помогли
Saymor
Отправлено: 18 Мая, 2011 - 12:47:23 • Тема: ul li: перенос строки • Форум: HTML, Дизайн & CSS
Ответов: 7 Просмотров: 8747
DeepVarvar пишет: div.pathway ul li {white-space: nowrap; }
не реагирует, заголовок у меня стоит:
CODE (
html ):
скопировать код в буфер обмена
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Saymor
Отправлено: 18 Мая, 2011 - 12:15:35 • Тема: ul li: перенос строки • Форум: HTML, Дизайн & CSS
Ответов: 7 Просмотров: 8747
Никаких реакций!
вот код CSS:
CODE (
htmlphp ):
скопировать код в буфер обмена
div. pathway {
display: block;
height: 20px;
line- height: 20px;
color: #666;
width: 100%;
overflow: hidden; white- space: nowrap;
margin: 0 0 2px 0 ;
padding: 0 ;
}
div. pathway ul, div. pathway ul li{
margin: 0 ; padding: 0 ; list- style: none; white- space: nowrap;
}
div. pathway ul li{ float: left; padding: 0 2px 0 2px; }
div. pathway li. pathway_arrow{ display: none; }
div. pathway li a{ white- space: nowrap;
height: 20px;
display: block;
background: url( ../ images/ layout/ arrow. png) no- repeat right;
color: #000;padding:0 15px 0 1px;text-decoration: underline;
}
div. pathway li a: hover{ text- decoration: none; }
Вот код HTML:
CODE (
html ):
скопировать код в буфер обмена
<div class = "pathway" >
<ul >
<li class = "pahway_home" ><a class = "pathway" href = "www.site.ru" > Главная страница</ a ></ li >
<li class = "pathway_arrow" > </ li >
<li ><a class = "pathway" href = "www.site.ru" > Категория</ a ></ li >
<li class = "pathway_arrow" > </ li >
<li > Заметка на интересных заметках</ li >
</ ul >
</ div >
Saymor
Отправлено: 18 Мая, 2011 - 10:32:05 • Тема: ul li: перенос строки • Форум: HTML, Дизайн & CSS
Ответов: 7 Просмотров: 8747
Вопрос интересный и одновременно простой.
есть патвей, Пример:
Главная страница -> Категория -> Статья -> Заметка на интересных заметках
все реализовано на ul li стиль float:left, ну тут все понятно,
пример сверху идеален, но если заголовок заметки слишком большой, то идет перенос заголовка на следующую строку. результат работы такой:
Главная страница -> Категория ->Статья ->
Заметка на интересных заметках
а мне надо:
Главная страница -> Категория ->Статья -> Заметка на
интересных заметках
возможно ли в моей ситуации реализовать задуманное?
Страниц (4): « 1 2 [3] 4 »
Powered by ExBB FM 1.0 RC1. InvisionExBB