PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (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:
скопировать код в буфер обмена
  1. <?PHP
  2.     // делаем запрос
  3.     $cats = "SELECT id,name,parent FROM category";
  4.      
  5.     // создаем многомерный массив
  6.     $tree = array();
  7.     for($i=0,$n=count($cats); $i<$n; $i++){
  8.      $cat = $cats[$i];
  9.             if(empty($tree[$cat->parent]))
  10.                     $tree[$cat->parent]=array();
  11.             $tree[$cat->parent][] = $cat;
  12.     }
  13.      
  14.     // вызываем рекурсивную функцию, передаём ей массив
  15.      ShowCategory($tree);
  16.      
  17.     // создаём рекурсивную функцию
  18.     function ShowCategory(&$tree,$k_parent=0, $count=0){ // добавляем $count
  19.         #########################
  20.        if(empty($tree[$k_parent])) return; ## НЕ ВИЖУ СМЫСЛА В ДАННОЙ СТРОКЕ
  21.        ## ТАК КАК И БЕЗ НЕЁ ВСЕ РАБОТАЕТ, А ВЫ КАК ДУМАЕТЕ?
  22.    
  23.         // выводим дерево
  24.         echo $k_parent ? "<ul>" : "";
  25.         for($i=0,$n=count($tree[$k_parent]); $i<$n; $i++){
  26.  
  27.         ####### Добавляем строчку кода, которая считает кол-во конечных потомков
  28.            @$count = count($tree[$tree[$k_parent][$i]->id]);
  29.         ######################################################
  30.  
  31.             echo "<li>";
  32.  
  33.             ##########################
  34.            if($count){ // если $count==0, то даем ссылку иначе <span>
  35.             ##########################
  36.  
  37.                 echo "<span>".$tree[$k_parent][$i]->name."</span>";
  38.             }else{
  39.                 echo "<a href='index.php?category=".$tree[$k_parent][$i]->id."'>".$tree[$k_parent][$i]->p_name."</a>";
  40.             }
  41.      
  42.             // функция вызывает сама себя с массивом $tree и $tree[$k_parent][$i]->id родителя
  43.             ShowCategory($tree, $tree[$k_parent][$i]->id, $count); // добавляем $count
  44.           echo "</li>";
  45.         }
  46.         echo $k_parent ? "</ul>" : "";
  47.     } ?>


прокомментируйте моё решение, может есть что-то более изящное?
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 - 16:51:20 • Тема: Вывод древовидной структуры из БД • Форум: Работа с СУБД

Ответов: 23
Просмотров: 8597
OrmaJever пишет:
Это спорный вопрос и зависит от вложености.


думаю вложенность будет максимум 4 - 5 уровней
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:
скопировать код в буфер обмена
  1. <?PHP
  2. // делаем запрос
  3. $cats = "SELECT id,name,parent FROM category";
  4.  
  5. // создаем многомерный массив
  6. $tree = array();
  7. for($i=0,$n=count($cats); $i<$n; $i++){
  8.  $cat = $cats[$i];
  9.         if(empty($tree[$cat->parent]))
  10.                 $tree[$cat->parent]=array();
  11.         $tree[$cat->parent][] = $cat;
  12. }
  13.  
  14. // вызываем рекурсивную функцию, передаём ей массив
  15.  ShowCategory($tree);
  16.  
  17. // создаём рекурсивную функцию
  18. function ShowCategory(&$tree,$k_parent=0){
  19.     if(empty($tree[$k_parent])) return;
  20.  
  21.     // выводим дерево
  22.     echo $k_parent ? "<ul>" : "";
  23.     for($i=0,$n=count($tree[$k_parent]); $i<$n; $i++){
  24.       echo "<li>";
  25.         if(??????? кое условие ?????????){ // здесь суть моего вопроса
  26.                 echo "<span>".$tree[$k_parent][$i]->name."</span>";
  27.         }else{
  28.             echo "<a href='index.php?category=".$tree[$k_parent][$i]->id."'>".$tree[$k_parent][$i]->p_name."</a>";
  29.         }
  30.  
  31.         // функция вызывает сама себя с массивом $tree и $tree[$k_parent][$i]->id родителя
  32.         ShowCategory($tree, $tree[$k_parent][$i]->id);
  33.       echo "</li>";
  34.     }
  35.     echo $k_parent ? "</ul>" : "";
  36. } ?>


Пожалуйста помогите создать условие.
поясню: в результате самый последний потомок должен быть ссылкой, любой родитель нет.
Saymor Отправлено: 07 Июля, 2011 - 12:06:10 • Тема: Вывод древовидной структуры из БД • Форум: SQL и Архитектура БД

Ответов: 3
Просмотров: 29
Slavenin пишет:
возможно


Нет, к сожалению не работает.. Огорчение
(Добавление)
или подскажите как сделать вывод того же самого, но без рекурсии?
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):
скопировать код в буфер обмена
  1. $query = "SELECT id,p_name,parent FROM category WHERE type = 'category' ORDER BY ordering ASC";

PHP:
скопировать код в буфер обмена
  1. <? echo "<pre>"; print_r($query); echo "</pre>"; ?>


результат, имеем массив в таком виде:
CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => stdClass Object
  3.         (
  4.             [id] => 1
  5.             [name] => Родитель 1
  6.             [parent] => 0
  7.         )
  8.  
  9.     [1] => stdClass Object
  10.         (
  11.             [id] => 14
  12.             [name] => Потомок 1.1.1
  13.             [parent] => 13
  14.         )
  15.  
  16.     [2] => stdClass Object
  17.         (
  18.             [id] => 13
  19.             [name] => Потомок 1.1
  20.             [parent] => 2
  21.         )
  22.  
  23.     [3] => stdClass Object
  24.         (
  25.             [id] => 11
  26.             [name] => Потомок 1.1
  27.             [parent] => 1
  28.         )
  29.  
  30.     [4] => stdClass Object
  31.         (
  32.             [id] => 12
  33.             [name] => Потомок 1.2
  34.             [parent] => 1
  35.         )
  36.  
  37.     [5] => stdClass Object
  38.         (
  39.             [id] => 15
  40.             [name] => Потомок 1.1.2
  41.             [parent] => 13
  42.         )
  43.  
  44.     [6] => stdClass Object
  45.         (
  46.             [id] => 2
  47.             [name] => Родитель 2
  48.             [parent] => 0
  49.         )
  50.  
  51.     [7] => stdClass Object
  52.         (
  53.             [id] => 3
  54.             [name] => Родитель 3
  55.             [parent] => 0
  56.         )
  57.  
  58.     [8] => stdClass Object
  59.         (
  60.             [id] => 4
  61.             [name] => Родитель 4
  62.             [parent] => 0
  63.         )
  64.  
  65.     [9] => stdClass Object
  66.         (
  67.             [id] => 5
  68.             [name] => Родитель 5
  69.             [parent] => 0
  70.         )
  71.  
  72.     [10] => stdClass Object
  73.         (
  74.             [id] => 6
  75.             [name] => Родитель 6
  76.             [parent] => 0
  77.         )
  78.  
  79. )


далее вывожу так:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $tree = array();
  4. for($i=0,$n=count($cats); $i<$n; $i++){
  5.  $cat = $cats[$i];
  6.  
  7.        if(empty($tree[$cat->parent]))
  8.              $tree[$cat->parent]=array();
  9.            $tree[$cat->parent][]=$cat;
  10. }
  11.  
  12. ShowCategory($tree);
  13.  
  14.  
  15. function ShowCategory(&$tree,$k_parent=0){
  16.     if(empty($tree[$k_parent])) return;
  17.  
  18.     echo $k_parent ? "<ul style='display:none;'>" : "<ul>";
  19.     for($i=0,$n=count($tree[$k_parent]); $i<$n; $i++){
  20.  
  21.        echo "<li>";
  22.        if(??????=Здесь должно быть условие=????????){
  23.             echo "<span>".$tree[$k_parent][$i]->p_name."</span>";
  24.        }else{
  25.             echo "<a href='index2.php?category=".$tree[$k_parent][$i]->id."'>".$tree[$k_parent][$i]->p_name."</a>";
  26.        }
  27.  
  28.         ShowCategory($tree, $tree[$k_parent][$i]->id);
  29.         echo "</li>";
  30.     }
  31.     echo $k_parent ? "</ul>" : "";
  32. }
  33. ?>


а суть условия такова: надо сделать самого последнего потомка ссылкой.
помогите добрым советом?
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):
скопировать код в буфер обмена
  1. <!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
DeepVarvar пишет:
nowrap

Никаких реакций!
вот код CSS:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. div.pathway {
  3. display:block;  
  4.     height:20px;
  5.     line-height:20px;
  6.     color:#666;
  7.    width:100%;
  8.     overflow:hidden;white-space: nowrap;
  9.     margin:0 0 2px 0;
  10.     padding:0;
  11. }
  12. div.pathway ul, div.pathway ul li{
  13.     margin:0;padding:0;list-style:none;white-space:nowrap;
  14. }
  15. div.pathway ul li{float:left;padding:0 2px 0 2px;}
  16. div.pathway li.pathway_arrow{display:none;}
  17. div.pathway li a{white-space: nowrap;
  18.     height:20px;
  19.     display:block;
  20.     background:url(../images/layout/arrow.png) no-repeat right;
  21.     color:#000;padding:0 15px 0 1px;text-decoration: underline;
  22. }
  23. div.pathway li a:hover{text-decoration:none;}
  24.  

Вот код HTML:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <div class="pathway">
  3.         <ul>
  4.                 <li class="pahway_home"><a class="pathway" href="www.site.ru">Главная страница</a></li>
  5.                 <li class="pathway_arrow">&nbsp;</li>
  6.                 <li><a class="pathway" href="www.site.ru">Категория</a></li>
  7.                 <li class="pathway_arrow">&nbsp;</li>
  8.                 <li>Заметка на интересных заметках</li>
  9.         </ul>
  10. </div>
  11.  
Saymor Отправлено: 18 Мая, 2011 - 10:32:05 • Тема: ul li: перенос строки • Форум: HTML, Дизайн & CSS

Ответов: 7
Просмотров: 8747
Вопрос интересный и одновременно простой.

есть патвей, Пример:


Главная страница -> Категория -> Статья -> Заметка на интересных заметках


все реализовано на ul li стиль float:left, ну тут все понятно,
пример сверху идеален, но если заголовок заметки слишком большой, то идет перенос заголовка на следующую строку. результат работы такой:

Главная страница -> Категория ->Статья ->
Заметка на интересных заметках


а мне надо:

Главная страница -> Категория ->Статья -> Заметка на
интересных заметках


возможно ли в моей ситуации реализовать задуманное?

Страниц (4): « 1 2 [3] 4 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB