MySQL Veritabanı PHP + CodeIgniter ile oluşturuluyor Sırasız Liste

1 Cevap php

Ben PHP kullanarak aşağıdaki biçimde dinamik olarak oluşturulmuş bir Sırasız liste oluşturmaya çalışıyorum. Ben CodeIgniter kullanıyorum ama sadece normal php olabilir.

Bu benim elde etmek için gereken son çıkıştır.

<ul id="categories" class="menu">
<li rel="1">
    Arts &amp; Humanities
    <ul>
        <li rel="2">
            Photography
            <ul>
                <li rel="3">
                    3D
                </li>
                <li rel="4">
                    Digital
                </li>
            </ul>
        </li>
        <li rel="5">
            History
        </li>
        <li rel="6">
                        Literature
        </li>
    </ul>
</li>
<li rel="7">
    Business &amp; Economy
</li>
<li rel="8">
    Computers &amp; Internet
</li>
<li rel="9">
    Education
</li>
<li rel="11">
    Entertainment
    <ul>
        <li rel="12">
            Movies
        </li>
        <li rel="13">
            TV Shows
        </li>
        <li rel="14">
            Music
        </li>
        <li rel="15">
            Humor
        </li>
    </ul>
</li>
<li rel="10">
    Health
</li>

Ve burada ben çalışmak zorunda benim SQL olduğunu.

--
-- Table structure for table `categories`
--

CREATE TABLE IF NOT EXISTS `categories` (
  `id` mediumint(8) NOT NULL auto_increment,
  `dd_id` mediumint(8) NOT NULL,
  `parent_id` mediumint(8) NOT NULL,
  `cat_name` varchar(256) NOT NULL,
  `cat_order` smallint(4) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Bu yüzden ben kategorilerin ilk düzeyini oluşturmak için en az 1 foreach döngü ihtiyacımız gidiyorum biliyorum.

Ne olduğunu bilmiyorum, her döngü içinde yineleme ve çocukların sonsuz bir ağaç olabileceğini, böylece ebeveynler için kontrol ve dinamik bir şekilde bunun nasıl olduğunu.

Sunabileceğiniz herhangi bir yardım için teşekkür ederiz.

Tim

1 Cevap

Eğer every kategorisini çıkış ediyorsanız, o zaman muhtemelen iki adımda bunu yapardım:

İlk olarak, veritabanındaki tüm ilgili verileri yakala

$items = array();

$res = mysql_query(...);
while ($row = mysql_fetch_assoc($res)) {
 $items[$row['parent_id']][] = $row;
}

Sonra ebeveyni tarafından gruplandırılan tüm öğeleri var. Daha sonra hepsini işlemek için bir özyinelemeli işlevini kullanabilirsiniz:

function showMenu($items, $parent = null) {
 // Assuming root elements have parent_id of 0:
 $index = $parent == null ? '0' : $parent;

 if (empty($items[$index])) {
  // No children, don't output anything
  return;
 }

 echo '<ul', $parent == null ? ' id="categories" ... ' : '', '>';

 foreach ($items[$index] as $child) {
  echo '<li rel="', $child['id'], '">', htmlentities($child['cat_name']);
  showMenu($items, $child['id']);
  echo '</li>';
 }

 echo '</ul>';
}

showMenu($items);

Fonksiyon özyinelemeli menüdeki her öğenin için çağırdı, ve bu madde herhangi bir çocuk olup olmadığını görmek için denetler edilir. Eğer varsa, o ilgili <li/> girişlerini yazdırır ve that öğenin çocuklarını yazdırmak için tekrar kendini çağırır.