Получить все дочерние, внуковые и т. д. узлы под родительским элементом с использованием PHP с результатами запроса MySQL
Исходная проблема:
Извлечение всех дочерних, внуковых и последующих узлов-потомков, связанных с родительским узлом, является распространенной задачей при работе с иерархическими структурами данных. Эта проблема возникает в сценариях, где таблицы базы данных используют модель списка смежности для организации данных.
Подход с использованием рекурсии:
Для решения этой проблемы рекурсия оказывается эффективным способом подход. Вот подробное объяснение того, как можно использовать рекурсию для достижения этой цели:
1. Создание базовой функции:
Рекурсивная функция — это функция, которая вызывает себя для решения проблемы и часто используется в сценариях, включающих иерархические или вложенные структуры данных. В этом случае наша базовая функция будет называться fetch_recursive.
2. Определение критериев для рекурсивных вызовов:
В fetch_recursive два основных условия определяют, когда выполняются рекурсивные вызовы:
3. Построение массива результатов:
Каждый раз, когда выполняется рекурсивный вызов, функция заполняет массив результатов соответствующими данными из текущего узла. Этот массив будет расти итеративно по мере прохождения рекурсивных вызовов по древовидной структуре.
4. Рекурсивный поиск дочерних узлов:
Если у текущего узла есть какие-либо дочерние узлы (определяемые наличием дочернего свойства), будет выполнен еще один рекурсивный вызов для получения этих дочерних узлов. Этот процесс продолжается до тех пор, пока не будут захвачены все дочерние узлы родительского узла.
Дополнительная функциональность:
1. Обработка внуков и потомков:
Рекурсивная природа fetch_recursive гарантирует, что он автоматически проходит по иерархии и извлекает не только дочерние узлы, но также внуков и последующих потомков.
2 . Объединение результатов:
После завершения всех рекурсивных вызовов функция возвращает единый всеобъемлющий массив, содержащий все узлы-потомки указанного родительского узла.
Реализация кода:
function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array()) { foreach($src_arr as $row) { if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid) { $rowdata = array(); foreach($row as $k => $v) $rowdata[$k] = $v; $cats[] = $rowdata; if($row['parent_id'] == $currentid) $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true)); } } return $cats; }
Использование:
Чтобы использовать функцию fetch_recursive, просто передайте исходный массив данных (в данном случае $data) и идентификатор узла, из которого вы хочу вернуть потомков. Например, чтобы получить все дочерние, внуки и узлы-потомки в узле 3:
$list = fetch_recursive($data, 3);
Это заполнит переменную $list массивом содержащий все соответствующие узлы.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3