Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсивная функция возвращает массив
 
 автор: mihdan   (09.07.2012 в 17:36)   письмо автору
 
 

Есть база


CREATE TABLE IF NOT EXISTS `legal_forms` (
  `id_form` int(10) unsigned NOT NULL AUTO_INCREMENT, // ИД
  `pid_form` int(10) unsigned NOT NULL DEFAULT '0', // Родитель
  `form_code` int(3) unsigned NOT NULL DEFAULT '0', // Код
  `form_name` varchar(255) NOT NULL, // Навзание
  `form_abbr` varchar(255) NOT NULL, // Абревиатура
  `sort` int(10) unsigned NOT NULL DEFAULT '1',
  `is_vis` tinyint(3) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_form`)
)


Есть функция


<?php
function getLegalForms($pid 0$level = -1) {
    global 
$db$cfg$lng$legal_forms;

    
$results = array();

    
$sql "SELECT  `id_form` AS `id`,
                    `pid_form` AS `pid`,
                    `form_name_
{$lng}` AS `name`
            FROM `legal_forms`
            WHERE `pid_form` = 
{$pid}
            ORDER BY `sort`
    "
;
    
$exec $db->getAll($sql);

    if (
DB::isError($exec)) die($exec->getDebugInfo());

    if (
count($exec)) {

        
$level++;

        foreach (
$exec as $item) {
            
$results[] = array(
                
'id' => $item->id,
                
'name' => $item->name,
                
'level' => $level
            
);

            
$results += getLegalForms($item->id$level);           
        }
    }

    return 
$results;
}
?>


Получаю данные в виде массива:


<?php
$array 
getLegalForms();
print_r($array);
?>


На выходе имею только первый уровень вложенности (pid_from = 0) и подразделы последнего элемента, остальные подразделы пропали.

Что я не так делаю?

  Ответить  
 
 автор: root   (09.07.2012 в 17:43)   письмо автору
 
   для: mihdan   (09.07.2012 в 17:36)
 

Debugger'ом за столько лет пользоваться не научились?

  Ответить  
 
 автор: mihdan   (09.07.2012 в 17:46)   письмо автору
 
   для: root   (09.07.2012 в 17:43)
 

Ни о каких дебагерах на данном хосте говорить нельзя :)

  Ответить  
 
 автор: Root   (09.07.2012 в 17:47)   письмо автору
 
   для: mihdan   (09.07.2012 в 17:46)
 

может имеет смысл $level в цикле инкрементировать?

  Ответить  
 
 автор: mihdan   (09.07.2012 в 17:50)   письмо автору
72.4 Кб
 
   для: Root   (09.07.2012 в 17:47)
 

Переменная $level носит чисто декоративный характер:


<?php
...
$legal_forms getLegalForms();

        if (
count($legal_forms)) {
            foreach (
$legal_forms as $legal_form) {
                
$tpl->assign('LegalFormName'str_repeat('&nbsp;'$legal_form['level'] * 4) . $legal_form['name']);
                
$tpl->assign('LegalFormValue'$legal_form['id']);

                
$tpl->assign('LegalFormSelected', ($legal_form['id'] == 25)
                    ? 
'selected'
                    
''
                
);
                
$tpl->parse('Html.Firms.Add.LegalForms.LegalForm');
            }
            
$tpl->parse('Html.Firms.Add.LegalForms');
        }
...

?>


Делает отступы внутри элемента option

  Ответить  
 
 автор: mihdan   (09.07.2012 в 17:47)   письмо автору
 
   для: root   (09.07.2012 в 17:43)
 

Сделал пока что так:


<?php
function getLegalForms($pid 0$level = -1) {
    global 
$db$cfg$lng$legal_forms;

    
$results = array();
    
$tmp = array();

    
$sql "SELECT  `id_form` AS `id`,
                    `pid_form` AS `pid`,
                    `form_name_
{$lng}` AS `name`
            FROM `crm_legal_forms`
            WHERE `pid_form` = 
{$pid}
            /*ORDER BY `form_name_
{$lng}`*/
            ORDER BY `sort`
    "
;
    
$exec $db->getAll($sql);

    if (
DB::isError($exec)) die($exec->getDebugInfo());

    if (
count($exec)) {

        
$level++;

        foreach (
$exec as $item) {
            
$results[] = array(
                
'id' => $item->id,
                
'name' => $item->name,
                
'level' => $level
            
);

            
$tmp getLegalForms($item->id$level);

            if (
count($tmp)) {
                foreach (
$tmp as $val) {
                    
$results[] = $val;
                }
            }
        }
    }

    return 
$results;
}
?>


Надеюсь, это верное решение

  Ответить  
 
 автор: mihdan   (11.07.2012 в 00:20)   письмо автору
 
   для: mihdan   (09.07.2012 в 17:47)
 

Есть право на жизнь у данного кода?

  Ответить  
 
 автор: Drago   (11.07.2012 в 02:18)   письмо автору
 
   для: mihdan   (11.07.2012 в 00:20)
 

Может вам будет проще, все же, выбрать одним запросом все записи сразу, чем дергать базу для каждой ветви?

  Ответить  
 
 автор: cheops   (11.07.2012 в 08:15)   письмо автору
 
   для: mihdan   (11.07.2012 в 00:20)
 

Кстати да, гораздо более быстрее, просто выбрать все записи в массив или два, а рекурсию пустить по ним - операции будут проходить в оперативной памяти, а вы съэкономите десяток-другой обращений к базе данных.

  Ответить  
 
 автор: mihdan   (11.07.2012 в 11:13)   письмо автору
 
   для: cheops   (11.07.2012 в 08:15)
 

Благодарю за критику и полезный совет

  Ответить  
 
 автор: root   (11.07.2012 в 15:22)   письмо автору
 
   для: cheops   (11.07.2012 в 08:15)
 

>Кстати да, гораздо более быстрее, просто выбрать все записи в массив или два, а рекурсию пустить по ним - операции будут проходить в оперативной памяти, а вы съэкономите десяток-другой обращений к базе данных.

Ему об этом уже говорили, в его же теме, ... пару лет назад, вот только толку нет.

  Ответить  
 
 автор: mihdan   (20.07.2012 в 14:43)   письмо автору
 
   для: root   (11.07.2012 в 15:22)
 

Ваше решение меня не устроило еще тогда, уж не помню причину (было условие, что можно править только библиотеку функций, а другие файлы нет). Собственно, поэтому его и не использовал.

За пост Trianon'a спасибо. Долго пытался его найти.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования