CompAS
Новичок
Структурирование разделов сайта при написании CMS
Пишу CMS. Разделы сайта хранятся в БД как записи. У каждого раздела есть поля id и pid (id родителя).
Встала задача структурирования разделов. Из исходного массива неупорядоченных записей нужно получить массив записей главных разделов (не имеющих pid). Каждый раздел нового массива должен содержать массив children, в котором будут находиться записи его подразделов, извлечённые из исходного массива. В свою очередь, каждый подраздел должен иметь свой массив children и т.д.
Захотел решить задачу методом рекурсии. Для этого написал 2 функции.
Проблема. Если подраздел находится (выполняется условие $sec['pid'] == $section['id']), запускается новая функция GetChildren, а "по возвращении" в первую функцию GetChildren цикл foreach не продолжается. То есть первый найденный подраздел записывается в $section['children'][0], а до других подразделов очередь не доходит.
Если закомментировать строчку GetChildren($sec,$arr), все подразделы первого уровня, естественно, находятся, но исчезает рекурсия, поэтому подразделы второго уровня не обрабатываются.
Подскажите, как решить проблему.
Пишу CMS. Разделы сайта хранятся в БД как записи. У каждого раздела есть поля id и pid (id родителя).
Встала задача структурирования разделов. Из исходного массива неупорядоченных записей нужно получить массив записей главных разделов (не имеющих pid). Каждый раздел нового массива должен содержать массив children, в котором будут находиться записи его подразделов, извлечённые из исходного массива. В свою очередь, каждый подраздел должен иметь свой массив children и т.д.
Захотел решить задачу методом рекурсии. Для этого написал 2 функции.
PHP:
function StructureSections (&$hash) {
// Извлекаем из входного массива разделы, не имеющие родительских разделов
// функция getElementsByValue работает 100%
$hash_ = getElementsByValue($hash,"pid",false);
foreach ($hash_ as $n => $section) GetChildren($hash_[$n],$hash);
$hash = $hash_;
}
function GetChildren (&$section, &$arr) {
foreach ($arr as $n => $sec):
if ($sec['pid'] == $section['id']):
GetChildren($sec,$arr);
$section['children'][] = $sec;
endif;
endforeach;
}
Если закомментировать строчку GetChildren($sec,$arr), все подразделы первого уровня, естественно, находятся, но исчезает рекурсия, поэтому подразделы второго уровня не обрабатываются.
Подскажите, как решить проблему.