Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2009, 11:28   #1
retail_ret
 
Регистрация: 10.08.2009
Сообщений: 8
По умолчанию Алгоритм сортировки по категориям

Здравствуйте. Довольно тривиальную задачу мне не удалось решить . Необходимо отсортировать и вывести данные в виде

Категория1
-категория1.1
--категория1.1.1
--категория1.1.2
--категория1.1.3
-категория1.2
--категория1.2.1
--категория1.2.2
--категория1.2.3
категорияN
-категорияN.N
--категорияN.N.N
Где 'категория' - это имя категории, цифры для ясности, при чем, категории могут быть неограниченной вложенности.
Исходные данные. Две таблицы. Таблица Категории, содержит два поля: catid (номер категории, при чем не по порядку, например 1,4 - 2 может и отсутствовать) и name (имя категории). Таблица Связи, содержит два поля: catid(номер категории, тот же,что и в первой таблице) и parentid (номер родительской категории).
Условие: берем sql запросом два массива из таблиц (по массиву на таблицу) и далее работаем только с массивами, то есть sql запроса всего два в начале.
Вот.
retail_ret вне форума Ответить с цитированием
Старый 10.08.2009, 11:57   #2
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

лично отвечал в двух такихже темах на этом форуме, ищите...

п.с. сортировка тут вообще непричем
свободен...
wall66 вне форума Ответить с цитированием
Старый 10.08.2009, 12:17   #3
retail_ret
 
Регистрация: 10.08.2009
Сообщений: 8
По умолчанию

Из топика вижу http://programmersforum.ru/showthread.php?t=56550 что до вашего шага 2 я дошёл, вот что значит "добавить подмассив" не понятно чисто синтаксически, добавить новое измерение массиву?
retail_ret вне форума Ответить с цитированием
Старый 10.08.2009, 12:24   #4
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

Цитата:
Сообщение от retail_ret Посмотреть сообщение
Из топика вижу http://programmersforum.ru/showthread.php?t=56550 что до вашего шага 2 я дошёл, вот что значит "добавить подмассив" не понятно чисто синтаксически, добавить новое измерение массиву?
у вас есть к примеру такой массив:
PHP код:
$tree=array(
    
'1'=>array(
        
'name'=>'k1',
    ),

    
'2'=>array(
        
'name'=>'k2',
    ),

    
'3'=>array(
        
'name'=>'k3',
    ),
); 
у каждой из категорий могут быть подкатегории, а могут и не быть:
PHP код:
$tree=array(
    
'1'=>array(
        
'name'=>'k1',

        
'subtree'=>array(
            
'4'=>array(
                
'name'=>'k4',
            ),
        ),
    ),

    
'2'=>array(
        
'name'=>'k2',

        
'subtree'=>array(
        ),
    ),

    
'3'=>array(
        
'name'=>'k3',

        
'subtree'=>array(
            
'5'=>array(
                
'name'=>'k5',
            ),

            
'6'=>array(
                
'name'=>'k6',
            ),
        ),
    ),
); 
в данном случае "подмассивом" является индекс subtree у каждой корневой категории

такиеже подмассивы будут и у внутренних подмассивов
PHP код:
$tree=array(
    
'1'=>array(
        
'name'=>'k1',

        
'subtree'=>array(
            
'4'=>array(
                
'name'=>'k4',

                
'subtree'=>array(
                ),
            ),
        ),
    ),

    
'2'=>array(
        
'name'=>'k2',

        
'subtree'=>array(
        ),
    ),

    
'3'=>array(
        
'name'=>'k3',

        
'subtree'=>array(
            
'5'=>array(
                
'name'=>'k5',

                
'subtree'=>array(
                    
'7'=>array(
                        
'name'=>'k7',

                        
'subtree'=>array(
                        ),
                    ),
                ),
            ),

            
'6'=>array(
                
'name'=>'k6',

                
'subtree'=>array(
                ),
            ),
        ),
    ),
); 
вам же нужно в цикле заполнить все подмассивы



чтобы не ограничивать вложенность - применяется рекурсия
свободен...

Последний раз редактировалось wall66; 10.08.2009 в 12:31.
wall66 вне форума Ответить с цитированием
Старый 10.08.2009, 15:03   #5
retail_ret
 
Регистрация: 10.08.2009
Сообщений: 8
По умолчанию

Заполнить массив номерами категорий, для проверки пытаюсь отобразить на странице размер массива возвращаемого функцией CreateMenuData(), Вот отрывок из кода: отредактировал, как выводить и проверить не знаю.
PHP код:
   function CreateMenuData()
        {
            
$AllCat=Helper::GetItems("#__sobi2_categories"); // получаем  все данные из таблицы категории  (все категории)
            
$CatRelations=Helper::GetItems("#__sobi2_cats_relations"); // данные из таблицы catid/parentid

            
for($i=0;$i<sizeof($AllCat);$i++)
                {
                    
$Exist=false;
                    for(
$j=0;$j<sizeof($CatRelations);$j++)
                    {
                        if(
$AllCat[$i]->catid==$CatRelations[$j]->catid$Exist=true;

                    }
                    if(!
$Exist)  $ParentCat[]=$AllCat[$i]->catid// получаем массив из catid без аттрибутов parent

                
}
            
$str;
            
$ParentCat=array(Helper::RecursFill($ParentCat,$CatRelatons));

            return 
$ParentCat;
        }
    function 
RecursFill($ParentCat,$CatRelatons)
        {
            if(!
Helper::GetSubCat($ParentCat,$CatRelatons)) return;
            else
               return array (
Helper::RecursFill(Helper::GetSubCat($ParentCat,$CatRelatons),$CatRelatons));
        }
    function 
GetSubCat($ParentCat,$CatRelatons)
        {
             for (
$ii=0;$ii<sizeof($ParentCat);$ii++)
                 {   
$Exist=false;
                     for(
$j=0;$j<sizeof($CatRelations);$j++)
                    {
                        if(
$CatRelations->parentid==$Parentcat[$ii])
                            {
                                
$temp[]=$CatRelations->catid;
                                
$Exist=true;
                              }
                      }
                      if(!
$Exist) return 0;
                }
                return 
$temp;
        } 

Последний раз редактировалось retail_ret; 10.08.2009 в 15:52.
retail_ret вне форума Ответить с цитированием
Старый 10.08.2009, 16:05   #6
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

боже, зачем использовать объекты ради какого-то дерева
PHP код:
/*
tree table:
id - integer
parent_id - integer (may be 0)
name - varchar
*/

$query=mysql_query("select all rows from tree table");

$category=array();
$dump=array();
while(
$row=mysql_fetch_assoc($query))
{
    if(!
$row['parent_id'])$category[$row['id']]=$row;
    
$dump[$row['id']]=$row;
}

$category=rec($category,$dump);
print_r($category);

function 
rec($category,$dump)
{
    foreach(
$category as $key=>$value)
    {
        
$category[$key]['category']=array();

        foreach(
$dump as $dkey=>$dvalue)
        {
            if(
$dvalue['parent_id']==$value['id'])$category[$key]['category'][$dvalue['id']]=$dvalue;
        }

        
$category[$key]['category']=rec($category[$key]['category'],$dump);
    }

    return 
$category;

свободен...
wall66 вне форума Ответить с цитированием
Старый 10.08.2009, 18:29   #7
retail_ret
 
Регистрация: 10.08.2009
Сообщений: 8
По умолчанию

Голова гудит . Код.
PHP код:
  function CreateMenuData()
        {
            
$AllCat=Helper::GetItems("#__sobi2_categories"); // получаем  все данные из таблицы категории  (все категории)
            
$CatRelations=Helper::GetItems("#__sobi2_cats_relations"); // данные из таблицы catid/parentid
            
$temp=array('id'=>'0','parent_id'=>'0','name'=>'0'); reset($temp);

            
$Category=array();
            
$Dump=array();
/* ПЕРЕВОЖУ ЧТОБ ТОЧНО РАБОТАЛО в формат Вашей таблицы в переменную temp, так как данные о родительских категориях в другой таблице */
            
for($i=0;$i<sizeof($AllCat);$i++) 
                {
                    
$temp['id']=$AllCat[$i]->catid;
                    
$temp['name']=$AllCat[$i]->name;
                    
$temp['parent_id']='0';
                    for(
$j=0;$j<sizeof($CatRelations);$j++)
                    {
                        if(
$AllCat[$i]->catid==$CatRelations[$j]->catid$temp['parent_id']=$CatRelations[$j]->parentid;

                    }
                    
next($temp);
                }
            
            for(
$i=0;$i<sizeof($temp);$i++) // ДАЛЬШЕ КОПИРУЮ ВАШ КОД и создаю переменные dump и category...
           
{
            if(!
$temp[$i]['parent_id'])$Category[$temp[$i]['id']]=$temp[$i];
            
$Dump[$temp[$i]['id']]=$temp[$i];
            }
         
$category=Helper::rec($Category,$Dump); // вызов фунцкции


            
return $category;
        }

       function 
rec($category,$dump// под чистую скопировано
{
    foreach(
$category as $key=>$value)
    {
        
$category[$key]['category']=array();

        foreach(
$dump as $dkey=>$dvalue)
        {
            if(
$dvalue['parent_id']==$value['id'])$category[$key]['category'][$dvalue['id']]=$dvalue;
        }

        
$category[$key]['category']=Helper::rec($category[$key]['category'],$dump);
    }

    return 
$category;

Не работает, пишет соединение с сервером сброшено. Видимо "перегружен запросами", без вызова рекурсивной функции страница открывается. Функции из класса, потому что пишу код в модуле Joomla. Как быть.
retail_ret вне форума Ответить с цитированием
Старый 10.08.2009, 22:32   #8
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

проверяйте содержимое массива на каждом этапе с помощью print_r(массив);

возможно, какие-то отношения у вас бесконечно зациклены, правда не совсем себе это представляю
свободен...
wall66 вне форума Ответить с цитированием
Старый 11.08.2009, 00:06   #9
retail_ret
 
Регистрация: 10.08.2009
Сообщений: 8
По умолчанию

Всё заработало. Разобрался и написал сам.
PHP код:
function rec(&$Category,$temp//  в $temp все записи, в $Category - записи без аттрибута parent_id
    
{
        for (
$i=0;$i<sizeof($Category);$i++)
        {  if(empty(
$Category[$i])) return array();
           
$Category[$i]['category']=array();

            for(
$j=0;$j<sizeof($temp);$j++)
                {
                    if(
$temp[$j]['parent_id']==$Category[$i]['id'])
                    {

                        
$Category[$i]['category'][]=$temp[$j];
                    }

                }
            
rec($Category[$i]['category'],$temp);
         }
        return 
$Category;
    } 
Вот вывод списка:
PHP код:
function strout($data)
{
  if(empty(
$data)){return;}

  echo 
"<ul>";
  for(
$i=0;$i<count($data);$i++)
  {
    echo 
"<li>"; echo $data[$i]['name'];
    
strout($data[$i]['category']);
    echo 
"</li>";
  }
  echo 
"</ul>";

Спасибо огромное.

Последний раз редактировалось retail_ret; 11.08.2009 в 00:11.
retail_ret вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритм сортировки «вставкой» curly182 Помощь студентам 2 19.10.2009 22:56
Алгоритм сортировки одномерного массива JOFRIF Общие вопросы C/C++ 4 19.07.2009 17:23
Нужна помощь в Pascal (Алгоритм сортировки) keanemusic Помощь студентам 9 08.02.2009 17:37
Помогите пожалуйста в Pascal (Алгоритм сортировки) JayDe Помощь студентам 3 29.01.2009 19:13