sql >> Databasteknik >  >> RDS >> Mysql

Få alla noder för barn, barnbarn etc under förälder med hjälp av php med mysql-frågeresultat

Redigera:

Jag hade tidigare lagt upp en lösning för att bygga en flerdimensionell array av utdatan du gav samt ett sätt att få alla underordnade element av ett visst id utanför den speciella arrayen. Jag har nu listat ut hur man hämtar de underordnade elementen direkt från din utdata (utan att först behöva gå igenom 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;
}

För att använda funktionen ovan, skicka helt enkelt in utmatningsmatrisen $data till det första argumentet och id du vill hämta de underordnade elementen från i det andra argumentet:

ex.:

$list = fetch_recursive($data, 3);

Vilket borde ge dig rätt arraystruktur för id 3 (som framgår av exemplet i den sista kodrutan till detta svar).

Ursprungligt svar:

Jag hade aldrig hunnit skriva en rekursiv funktion för att bygga kapslade träd av denna design förrän nu. Jag är säker på att det finns många andra som har skrivit liknande funktioner, men den här borde definitivt fungera för 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;
}

Den här funktionen kommer rekursivt att bygga ett träd från en angränsande lista och hålla id:erna ordnade i stigande ordning. Detta gör också id är för varje förälder/barn nyckeln till varje samling av information.

Denna kod:

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

Kommer att mata ut något så här:

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()
                    )
                )
            )
        )
    )
)

För att få alla underordnade noder för ett visst id på en endimensionell array kan du använda den här funktionen:

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

Baserat på buildtree() funktionen ovan, låt oss säga att vi ville få alla underordnade noder av id 3:

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

Detta kommer att mata ut:

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. Mysql-problem när du skapar en ny användare

  2. Skript för att spara varbinära data på disken

  3. Få ett Mysql-resultat utan att veta ett kolumnnamn

  4. Läsa tidsstämplar vid import av data i SQL Developer