«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как получить все дочерние, внуковые и дочерние узлы родительского узла с помощью PHP с результатами запроса MySQL?

Как получить все дочерние, внуковые и дочерние узлы родительского узла с помощью PHP с результатами запроса MySQL?

Опубликовано 17 ноября 2024 г.
Просматривать:234

How do I retrieve all child, grandchild, and descendant nodes under a parent node using PHP with MySQL query results?

Получить все дочерние, внуковые и т. д. узлы под родительским элементом с использованием 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