Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Dapatkan semua node anak, cucu, dll di bawah induk menggunakan php dengan hasil kueri mysql

Sunting:

Saya sebelumnya telah memposting solusi untuk membangun array multi-dimensi dari output yang Anda berikan serta cara untuk mendapatkan semua elemen anak dari id tertentu keluar dari array tertentu. Saya sekarang telah menemukan cara untuk mengambil elemen anak langsung dari output Anda (tanpa harus terlebih dahulu melalui buildtree() fungsi:

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

Untuk menggunakan fungsi di atas, cukup masukkan larik keluaran $data ke argumen pertama dan id Anda ingin mengambil elemen anak dari argumen kedua:

mis.:

$list = fetch_recursive($data, 3);

Yang seharusnya memberi Anda struktur array yang benar untuk id 3 (seperti yang terlihat pada contoh di kotak kode terakhir untuk jawaban ini).

Jawaban Asli:

Saya belum pernah menulis fungsi rekursif untuk membangun pohon bersarang dari desain ini sampai sekarang. Saya yakin ada banyak orang lain yang telah menulis fungsi serupa, tetapi yang ini pasti cocok untuk Anda:

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

Fungsi ini akan secara rekursif membangun pohon dari daftar adjacency dan menjaga urutan id dalam urutan menaik. Ini juga membuat id 's dari setiap orang tua/anak kunci dari setiap array informasi.

Kode ini:

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

Akan menampilkan sesuatu seperti ini:

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

Untuk mendapatkan semua simpul anak dari id tertentu ke array satu dimensi, Anda dapat menggunakan fungsi ini:

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

Berdasarkan buildtree() fungsi di atas, katakanlah kita ingin mendapatkan semua node anak dari id 3:

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

Ini akan menampilkan:

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. Simpan nama fungsi dalam database dan kemudian jalankan

  2. Mencari untuk mengekstrak data antara tanda kurung dalam string melalui MYSQL

  3. tidak dapat mengubah tabel, Tabel 'xxx/#sql-ib265' sudah ada

  4. MyISAM versus InnoDB

  5. PHP:Jika record ada, tampilkan HTML, yang lain tidak menampilkan apa-apa