|
|
|
| Есть база
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) и подразделы последнего элемента, остальные подразделы пропали.
Что я не так делаю? | |
|
|
|
|
|
|
|
для: mihdan
(09.07.2012 в 17:36)
| | Debugger'ом за столько лет пользоваться не научились? | |
|
|
|
|
|
|
|
для: root
(09.07.2012 в 17:43)
| | Ни о каких дебагерах на данном хосте говорить нельзя :) | |
|
|
|
|
|
|
|
для: mihdan
(09.07.2012 в 17:46)
| | может имеет смысл $level в цикле инкрементировать? | |
|
|
|
|
 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(' ', $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 | |
|
|
|
|
|
|
|
для: 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
(09.07.2012 в 17:47)
| | Есть право на жизнь у данного кода? | |
|
|
|
|
|
|
|
для: mihdan
(11.07.2012 в 00:20)
| | Может вам будет проще, все же, выбрать одним запросом все записи сразу, чем дергать базу для каждой ветви? | |
|
|
|
|
|
|
|
для: mihdan
(11.07.2012 в 00:20)
| | Кстати да, гораздо более быстрее, просто выбрать все записи в массив или два, а рекурсию пустить по ним - операции будут проходить в оперативной памяти, а вы съэкономите десяток-другой обращений к базе данных. | |
|
|
|
|
|
|
|
для: cheops
(11.07.2012 в 08:15)
| | Благодарю за критику и полезный совет | |
|
|
|
|
|
|
|
для: cheops
(11.07.2012 в 08:15)
| | >Кстати да, гораздо более быстрее, просто выбрать все записи в массив или два, а рекурсию пустить по ним - операции будут проходить в оперативной памяти, а вы съэкономите десяток-другой обращений к базе данных.
Ему об этом уже говорили, в его же теме, ... пару лет назад, вот только толку нет. | |
|
|
|
|
|
|
|
для: root
(11.07.2012 в 15:22)
| | Ваше решение меня не устроило еще тогда, уж не помню причину (было условие, что можно править только библиотеку функций, а другие файлы нет). Собственно, поэтому его и не использовал.
За пост Trianon'a спасибо. Долго пытался его найти. | |
|
|
|