Maison  >  Article  >  base de données  >  Comment récupérer tous les nœuds enfants, petits-enfants et descendants sous un nœud parent à l'aide de PHP avec les résultats de requête MySQL ?

Comment récupérer tous les nœuds enfants, petits-enfants et descendants sous un nœud parent à l'aide de PHP avec les résultats de requête MySQL ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-09 01:35:02830parcourir

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

Obtenir tous les nœuds enfants, petits-enfants, etc. sous parent en utilisant PHP avec les résultats de requête MySQL

Problème d'origine :

Récupérer tous les nœuds enfants, petits-enfants et descendants suivants associés à un nœud parent est une tâche courante lorsque l'on travaille avec des structures de données hiérarchiques. Ce problème survient dans les scénarios où les tables de base de données utilisent un modèle de liste de contiguïté pour l'organisation des données.

Approche utilisant la récursion :

Pour résoudre ce problème, la récursivité s'avère être une solution efficace. approche. Voici une explication détaillée de la façon dont la récursivité peut être utilisée pour atteindre cet objectif :

1. Établir une fonction de base :

Une fonction récursive est une fonction qui fait appel à elle-même pour résoudre un problème et est souvent utilisée dans des scénarios impliquant des structures de données hiérarchiques ou imbriquées. Dans ce cas, notre fonction de base s'appellera fetch_recursive.

2. Identification des critères pour les appels récursifs :

Dans fetch_recursive, deux conditions principales déterminent le moment où les appels récursifs sont effectués :

  • Nœud parent trouvé : Lorsque le Le nœud actuel en cours d'évaluation est le nœud parent qui nous intéresse (en fonction de l'ID fourni).
  • Nœud enfant trouvé : Lorsque le nœud actuel a un ID parent qui correspond à l'ID du nœud parent .

3. Construction du tableau de résultats :

Chaque fois qu'un appel récursif est effectué, la fonction remplira un tableau de résultats avec les données pertinentes du nœud actuel. Ce tableau grandira de manière itérative à mesure que les appels récursifs traverseront la structure arborescente.

4. Recherche récursive de nœuds enfants :

Si le nœud actuel a des nœuds enfants (identifiés par l'existence d'une propriété enfants), un autre appel récursif sera effectué pour récupérer ces nœuds enfants. Ce processus se poursuit jusqu'à ce que tous les nœuds enfants du nœud parent soient capturés.

Fonctionnalité supplémentaire :

1. Gestion des petits-enfants et des descendants :

La nature récursive de fetch_recursive garantit qu'il traversera automatiquement la hiérarchie et récupérera non seulement les nœuds enfants, mais également les petits-enfants et les descendants ultérieurs.

2 . Résultats unificateurs :

Une fois tous les appels récursifs terminés, la fonction renvoie un tableau unique et complet contenant tous les nœuds descendants sous le nœud parent spécifié.

Implémentation du code :

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;
}

Utilisation :

Pour utiliser la fonction fetch_recursive, transmettez simplement le tableau de données d'origine (dans ce cas, $data) et l'ID du nœud dont vous souhaitez récupérer les descendants. Par exemple, pour récupérer tous les nœuds enfants, petits-enfants et descendants sous le nœud 3 :

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;
}

Cela remplira la variable $list avec un tableau contenant tous les nœuds pertinents.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn