Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pobierz wszystkie węzły potomne, wnuki itp. pod rodzicami za pomocą php z wynikami zapytania mysql

Edytuj:

Wcześniej opublikowałem rozwiązanie do zbudowania wielowymiarowej tablicy z danych wyjściowych, które podałeś, a także sposób na uzyskanie wszystkich elementów podrzędnych określonego id z tej konkretnej tablicy. Teraz zorientowałem się, jak pobrać elementy podrzędne bezpośrednio z danych wyjściowych (bez konieczności przechodzenia przez buildtree() funkcja:

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

Aby użyć powyższej funkcji, po prostu przekaż tablicę wyjściową $data do pierwszego argumentu i id chcesz pobrać elementy potomne z drugiego argumentu:

np.:

$list = fetch_recursive($data, 3);

Co powinno dać ci poprawną strukturę tablicy dla id 3 (jak widać w przykładzie w ostatnim polu kodu do tej odpowiedzi).

Oryginalna odpowiedź:

Do tej pory nigdy nie miałem okazji napisać funkcji rekurencyjnej do budowania zagnieżdżonych drzew z tego projektu. Jestem pewien, że jest wielu innych, którzy napisali podobne funkcje, ale ta z pewnością powinna Ci pomóc:

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

Ta funkcja rekursywnie zbuduje drzewo z listy sąsiedztwa i utrzyma kolejność identyfikatorów w porządku rosnącym. Powoduje to również, że id każdego rodzica/dziecka klucz każdej tablicy informacji.

Ten 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>';
';

Wygeneruje coś takiego:

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

Aby uzyskać wszystkie węzły podrzędne określonego id na jednowymiarową tablicę, możesz użyć tej funkcji:

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

Na podstawie buildtree() powyżej, powiedzmy, że chcieliśmy uzyskać wszystkie węzły potomne o id 3:

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

To wygeneruje:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. przeszukaj bazę danych na podstawie wartości wybranej z bazy danych

  2. Jak modelowałbyś wariancję zmiennych danych na wspólnym schemacie? SQL

  3. Wynik zapytania mysql do tablicy php

  4. Potrzebuję nietypowych wyników zamawiania mysql

  5. 5 sposobów na sprawdzenie, czy tabela istnieje w MySQL