[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: сортировка полученных данных из базы данных
asse
Всем добрый день! (или вечер, или утро :-) )

Я только начинаю разбираться в пхп.

Значит в чем суть проблемы.

Есть база данных. В одной таблице хранятся все категории/подкатегории.

Сайт на ДЛЕ.

вот таким кодом я вывожу все категории, что есть в базе:
PHP
<?php
/*
вывод всех категорий и подкатегорий
*/

$asse='';
$b=$db->query ("SELECT * from `dle_category` ORDER BY `posi`");
while (
$row=$db->get_array($b))
{
$link=$config['http_home_url'].'index.php?do=cat&category='.$row['alt_name'];
if (
file_exists(ROOT_DIR."/templates/{$config['skin']}/images/icon/{$row['alt_name']}.gif"))
    
$icon="{THEME}/images/icon/{$row['alt_name']}.gif";
else
    
$icon='';

$asse.="{$row['id']},{$row['parentid']},'{$row['name']}','{$link}','{$row['descr']}','','{$icon}','{$icon}';";
}



Результат, как вы понимаете, есть большушая строка.

Нужно теперь как-то все это отсортировать.

Главная категория имеет определенное значение ID, а вложенная в нее подкатегория имеет значение parentid=ID родительской категории. Так формируется как-бы дерево всех категорий.

Вот я вывел все эти категории на сайт большущим списком, как теперь мне их отсортировать, чтобы оно и на сайте выглядело примерно как дерево. Можно и подругому(например для каждой категории создается блок <div>, в котором списком <ul> идут все ее подкатегории)

Надеюсь, хоть понятно объяснил =)

Жду ваших советов.



Спустя 1 час, 13 минут, 23 секунды (24.12.2008 - 16:37) FatCat написал(а):
http://phpforum.ru/index.php?showtopic=14924 - тут обсуждение практически такой же задачи.

Спустя 44 минуты, 4 секунды (24.12.2008 - 17:21) asse написал(а):
посмотрел...там в результате получаем вот такой кусок кода
PHP
function db_line($data$parent=0$level=0)
{
    
$arr $data[$parent];

    for(
$i 0$i count($arr); $i++)
    {
        echo 
'<span style="padding-left:'.($level*30).'px">'.$arr[$i]['name'].'</span><br />';
        if(
count($data[$arr[$i]['id']]))
            
db_line($data$arr[$i]['id'], $level 1);
    }
}


$arr = array(
    array(
'id'=>1'pid'=>0'name'=>'Comment 1'), 
        array(
'id'=>2'pid'=>1'name'=>'Comment 1.1'), 
            array(
'id'=>4'pid'=>2'name'=>'Comment 1.1.1'), 
            array(
'id'=>5'pid'=>2'name'=>'Comment 1.1.2'), 
            array(
'id'=>7'pid'=>2'name'=>'Comment 1.1.3'), 
        array(
'id'=>3'pid'=>1'name'=>'Comment 1.2'), 
        array(
'id'=>6'pid'=>1'name'=>'Comment 1.3'), 
    array(
'id'=>8'pid'=>0'name'=>'Comment 2'), 
);

for(
$i 0$c count($arr); $i $c$i++)
{
    
$new_arr[$arr[$i]['pid']][] = $arr[$i];
}

db_line($new_arr);


я не совсем еще разбираюсь в PHP...кое что понял, кое что нет...
FatCat, можешь помочь мне сделать на основе этого кода сортировку типа:
допустим есть общий <div> для категории. id категории равно 9, все элементы у которых parentid=9(следовательно они являются подпунктами категории с ид 9) выстраиваются в этом же диве, но дам с паддингом или br, не важно.

и так пока цикл не переберет все пункты таблицы. И каждая новая родительская категория шла бы в новый div

буду очень благодарен за помощт ;-)

Спустя 48 минут, 54 секунды (24.12.2008 - 18:10) FatCat написал(а):
Сорри, сейчас другой работы много.

Спустя 4 минуты, 44 секунды (24.12.2008 - 18:14) asse написал(а):
жаль.. а сложно это сделать?

Спустя 2 часа, 15 минут, 24 секунды (24.12.2008 - 20:30) Гость написал(а):
Сделай вывод вот такого массива как в примере
$arr
то есть подставь в него свои значения
а потом немного измени функцию db_line
видишь там padding /// вот и пиши свои дивы , а может тебе и падинг подойдёт

Спустя 38 минут, 45 секунд (24.12.2008 - 21:09) kirik написал(а):
PHP
function db_line($data$parent=0$level=0)
{
    
$arr $data[$parent];

    for(
$i 0$i count($arr); $i++)
    {
        echo 
'<span style="padding-left:'.($level*30).'px">'.$arr[$i]['name'].'</span><br />';
        if(
count($data[$arr[$i]['id']]))
            
db_line($data$arr[$i]['id'], $level 1);
    }
}


$b=$db->query ("SELECT * from `dle_category` ORDER BY `posi`");
while (
$row=$db->get_array($b))
{
      
$new_arr[$row['parentid']][] = $row;
}

db_line($new_arr);


Вот так попробуй=)

Спустя 36 минут, 10 секунд (24.12.2008 - 21:45) asse написал(а):
kirik мега респект тебе!!!!! бывай тут иногда, может еще помощь таких профессионалов потребуется!

Спустя 29 минут, 29 секунд (24.12.2008 - 22:14) asse написал(а):
kirik, можешь еще подсказать, как упорядочить вывод...

т.е.:
HTML
<div>
<span>категория</span>
<ul>
<li>подкатегория 1</li>
<li>подкатегория 2</li>
<li><div><span>подкатегория3 (у нее еще есть подпункты)</span>
<ul>
<li>подпункт 3-1</li>
<li>подпункт 3-2</li>
<li>подпункт 3-3</li>
</ul>
</div></li>
</ul>
</div>



и так далее

т.е. если есть несколько вложенностей категорий

Спустя 4 часа, 44 минуты, 19 секунд (25.12.2008 - 02:58) kirik написал(а):
asse, а сам подумать? Напиши, как ты видишь реализацию "ступенчатости" категорий, и тебе подскажут где ты не прав (а может и сам разберешься! =)).

Спустя 8 часов, 32 минуты, 16 секунд (25.12.2008 - 11:31) asse написал(а):
просто я полохо очень разбираюсь в PHP :-(

в твой код я добавил формирование правельных ссылок...
PHP
function db_line($data$parent=0$level=0)
{
    
    
$arr $data[$parent];

    for(
$i 0$i count($arr); $i++)
    {
        echo 
'<div style="border: 2px red solid; padding-left:'.($level*30).'px"><a href="index.php?do=cat&category='.$arr[$i]['alt_name'].'">'.$arr[$i]['name'].'</a></div><br />';
        if(
count($data[$arr[$i]['id']]))
            
db_line($data$arr[$i]['id'], $level 1);
    }
}


$b=$db->query ("SELECT * from `dle_category` ORDER BY `posi`");
while (
$row=$db->get_array($b))
{
      
$new_arr[$row['parentid']][] = $row;
      
      
$new2_arr[$row['alt_name']][] = $row;
      
      
}


db_line($new_arr);



а вот как сделать правильной условие, знаний не хватает...

я дуаю там должно быть что-то типа:
если id=parentid, то ссылки идут в <li>
иначе ссылки идут в div

Спустя 14 минут, 11 секунд (25.12.2008 - 11:45) kirik написал(а):
Цитата (asse @ 25.12.2008 - 03:31)
если id=parentid

А в каком случае это получается? Меню, которое и родительское и дочернее?))
Смотри..

PHP
for($i 0$i count($arr); $i++)
    {
        echo 
'<div style="padding-left:'.($level*30).'px">'.$arr[$i]['name'].'</div><br />'// Тут выводим родительское меню, так?
        
if(count($data[$arr[$i]['id']])) // Если имеем дочерние меню к этому родительскому -
            
db_line($data$arr[$i]['id'], $level 1); // выводим их
    
}

Правильно?

Тоесть если сделаем так -

PHP
for($i 0$i count($arr); $i++)
    {
        echo 
'<div id="1">
                     <div style="padding-left:'
.($level*30).'px">'.$arr[$i]['name'].'</div><br />';
        if(
count($data[$arr[$i]['id']]))
            echo 
'<div id="sub">'.db_line($data$arr[$i]['id'], $level 1).'</div{id="sub"}>';
        echo 
'</div{id="1"}>';
    }


То у нас получится примерно это -

PHP
<div id="1">
    <
div style="padding-left:0px">Меню 1</div><br />
    <
div id="sub">
        <
div style="padding-left:30px">Меню 1.1</div><br />
        <
div style="padding-left:30px">Меню 1.2</div><br />
    </
div{id="sub"}>
</
div{id="1"}>


Прально?
Подумай, как можно в li перевести =)

Спустя 15 минут, 32 секунды (25.12.2008 - 12:00) asse написал(а):
по идее вот так вот
PHP
for($i = 0; $i < count($arr); $i++)
    {
        echo '<div id="1">
                     <div style="padding-left:'
.($level*30).'px">'.$arr[$i]['name'].'</div><br />';
        if(count($data[$arr[$i]['id']]))
            echo '<ul id="sub"><li>'.db_line($data, $arr[$i]['id'], $level + 1).'</li></ul>';
        echo '</div>';
    }    
}

только на выходе мы имеем для одной категории и 2-субкатегорий:
HTML
<div id="1">
<div style="padding-left:0px">Представление интересов</div><br /><div id="1">
<div style="padding-left:30px">Представлю интересы</div><br /></div><div id="1">
<div style="padding-left:30px">Нужен представитель</div><br /></div><ul id="sub"><li></li></ul></div>


_____________
мы делили апельсин. Много наших полегло О_о
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.