sql >> Database teknologi >  >> RDS >> Mysql

Få alle knudepunkter for børn, børnebarn osv. under forældre ved hjælp af php med mysql-forespørgselsresultater

Rediger:

Jeg havde tidligere postet en løsning til at bygge et multidimensionelt array ud af det output, du gav, samt en måde at få alle underordnede elementer af et bestemt id ud af det pågældende array. Jeg har nu fundet ud af, hvordan man henter de underordnede elementer direkte fra dit output (uden først at skulle gennemgå en buildtree() funktion:

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

For at bruge funktionen ovenfor skal du blot sende output-arrayet $data ind til det første argument og id du vil hente de underordnede elementer fra i det andet argument:

eks.:

$list = fetch_recursive($data, 3);

Hvilket burde give dig den korrekte matrixstruktur for id 3 (som det ses i eksemplet i den sidste kodeboks til dette svar).

Oprindeligt svar:

Jeg havde aldrig nået at skrive en rekursiv funktion til at bygge indlejrede træer ud af dette design indtil nu. Jeg er sikker på, at der er masser af andre, der har skrevet lignende funktioner, men denne burde helt sikkert fungere for dig:

function buildtree($src_arr, $parent_id = 0, $tree = array())
{
    foreach($src_arr as $idx => $row)
    {
        if($row['parent_id'] == $parent_id)
        {
            foreach($row as $k => $v)
                $tree[$row['id']][$k] = $v;
            unset($src_arr[$idx]);
            $tree[$row['id']]['children'] = buildtree($src_arr, $row['id']);
        }
    }
    ksort($tree);
    return $tree;
}

Denne funktion vil rekursivt bygge et træ ud af en tilstødende liste og holde id'erne ordnet i stigende rækkefølge. Dette gør også id er for hver forælder/barn nøglen til hver række informationer.

Denne kode:

$r = mysql_query("SELECT * FROM test ");
$data = array();
while($row = mysql_fetch_assoc($r)) {
    $data[] = $row;
}
echo '<pre>';
print_r(buildtree($data));
echo '</pre>';
';

Vil udskrive noget som dette:

Array 
(
    [1] => Array 
    (
        [id] => 1
        [name] => Electronics 
        [parent_id] => 0 
        [children] => Array
        (
            [2] => Array 
            ( 
                [id] => 2
                [name] => Televisions 
                [parent_id] => 1 
                [children] => Array
                (
                    [4] => Array 
                    (
                        [id] => 4
                        [name] => Tube 
                        [parent_id] => 2
                        [children] => Array()
                    )
                    [5] => Array 
                    (
                        [id] => 5
                        [name] => LCD 
                        [parent_id] => 2
                        [children] => Array()
                    )
                    [6] => Array
                    (
                        [id] => 6
                        [name] => Plasma 
                        [parent_id] => 2
                        [children] => Array()
                    )
                )
            )
            [3] => Array 
            (
                [id] => 3
                [name] => Portable Electronics 
                [parent_id] => 1
                [children] => Array
                (
                    [7] => Array
                    (
                        [id] => 7
                        [name] => Mp3 Players 
                        [parent_id] => 3 
                        [children] => Array
                        (
                            [10] => Array
                            (
                                [id] => 10
                                [name] => Flash 
                                [parent_id] => 7
                                [children] => Array()
                            ) 
                        )
                    )
                    [8] => Array 
                    (
                        [id] => 8
                        [name] => CD Players 
                        [parent_id] => 3
                        [children] => Array()
                    )
                    [9] => Array 
                    (
                        [id] => 9
                        [name] => 2 Way Radios 
                        [parent_id] => 3
                        [children] => Array()
                    )
                )
            )
        )
    )
)

For at få alle underordnede noder af et bestemt id på et endimensionelt array, kan du bruge denne funktion:

function fetch_recursive($tree, $parent_id, $parentfound = false, $list = array())
{
    foreach($tree as $k => $v)
    {
        if($parentfound || $k == $parent_id)
        {
            $rowdata = array();
            foreach($v as $field => $value)
                if($field != 'children')
                    $rowdata[$field] = $value;
            $list[] = $rowdata;
            if($v['children'])
                $list = array_merge($list, fetch_recursive($v['children'], $parent_id, true));
        }
        elseif($v['children'])
            $list = array_merge($list, fetch_recursive($v['children'], $parent_id));
    }
    return $list;
}

Baseret på buildtree() funktionen ovenfor, lad os sige, at vi ønskede at få alle underordnede noder af id 3:

echo '<pre>';
print_r(fetch_recursive(buildtree($a), 3));
echo '</pre>';
';

Dette vil udsende:

Array
(
    [0] => Array
        (
            [id] => 3
            [name] => Portable Electronics
            [parent_id] => 1
        )

    [1] => Array
        (
            [id] => 7
            [name] => Mp3 Players
            [parent_id] => 3
        )

    [2] => Array
        (
            [id] => 10
            [name] => Flash
            [parent_id] => 7
        )

    [3] => Array
        (
            [id] => 8
            [name] => CD Players
            [parent_id] => 3
        )

    [4] => Array
        (
            [id] => 9
            [name] => 2 Way Radios
            [parent_id] => 3
        )

)


  1. PostgreSQL hvordan man kan se hvilke forespørgsler der er kørt

  2. Parametriseret dynamisk sql-forespørgsel

  3. Lagring af Apache Hadoop-dataoutput til Mysql-database

  4. tilføj kolonne til mysql-tabellen, hvis den ikke eksisterer