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

Pohon menu gema dengan fungsi rekursif

Bagaimana dengan:

function recurse($categories, $parent = null, $level = 0)
{
    $ret = '<ul>';
    foreach($categories as $index => $category)
    {
        if($category['root'] == $parent)
        {
            $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
            $ret .= $this->recurse($categories, $category['id'], $level+1);
            $ret .= '</li>';
        }
    }
    return $ret . '</ul>';
}

Fungsi ini mengharuskan Anda terlebih dahulu menanyakan database Anda untuk seluruh daftar kategori yang tersedia dan mengasumsikan bahwa kategori akar Anda memiliki nilai null, tetapi fungsi tersebut dapat diubah untuk menerima -1 atau 0 bergantung pada cara kerja skema Anda saat ini.

$categories = { get from database into an multi-dimensional array };
$Tree = $this->recurse($categories);
echo $Tree;

Anda dapat mempertimbangkan untuk melakukan hal berikut untuk mencegah munculnya UL kosong saat tidak ada anak untuk orang tua:

function recurse($categories, $parent = null, $level = 0)
{
    $ret = '<ul>';
    foreach($categories as $index => $category)
    {
        if($category['root'] == $parent)
        {
            $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
            $sub = $this->recurse($categories, $category['id'], $level+1);
            if($sub != '<ul></ul>')
                $ret .= $sub;
            $ret .= '</li>';
        }
    }
    return $ret . '</ul>';
}

Namun, solusi terbaik adalah dengan memilih data Anda untuk menyertakan kolom yang berisi berapa banyak kategori anak yang dimiliki setiap kategori.

select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category

Di mana fungsi Anda akan menjadi:

function recurse($categories, $parent = null, $level = 0)
{
    $ret = '<ul>';
    foreach($categories as $index => $category)
    {
        if($category['root'] == $parent)
        {
            $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
            if($category['ChildCount'] > 0)
                $ret .= $this->recurse($categories, $category['id'], $level+1);
            $ret .= '</li>';
        }
    }
    return $ret . '</ul>';
}

Semoga membantu?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tampilkan hasil MySQL berdasarkan tanggal

  2. Bagaimana cara kueri mengalikan 2 sel untuk setiap baris MySQL?

  3. Mengapa saya tidak menggunakan fungsi mysql_* di PHP?

  4. Menemukan perbedaan antara istilah terbaru dan terbaru kedua

  5. batasan kunci asing mysql adalah kesalahan yang salah bentuk