Witam!
Skrypt na drzewo kategori wyglada tak:


  1. <?php
  2. function sortuj($a,$b) {
  3.  
  4. $a = preg_replace("/|[^|]*$/","",$a); $a = explode("|",$a);
  5. $b = preg_replace("/|[^|]*$/","",$b); $b = explode("|",$b);
  6.  
  7. $max = 1;
  8.  
  9. foreach ($a as $w) if (strlen($w) > $max) $max = strlen($w);
  10. foreach ($b as $w) if (strlen($w) > $max) $max = strlen($w);
  11.  
  12. for ($x=0,$c=count($a);$x<$c;$x++) while (strlen($a[$x]) < $max) $a[$x] = '0'.$a[$x];
  13.  
  14. for ($x=0,$c=count($b);$x<$c;$x++) while (strlen($b[$x]) < $max) $b[$x] = '0'.$b[$x];
  15.  
  16. $a = implode("|",$a);
  17. $b = implode("|",$b);
  18.  
  19. return strcmp($a,$b);
  20.  
  21.  }
  22.  
  23.  $zap = mysql_query("SELECT * FROM menu");
  24.  $c = mysql_num_rows($zap);
  25.  
  26.  while (list($nazwa,$pos) = mysql_fetch_array($zap)) {
  27.  $tree[] = $pos.'|'.$nazwa;
  28.  } unset($zap);
  29.  
  30.  if ($c > 0) {
  31.  
  32. $kat = IsSet($_GET['kat']) ? (int)$_GET['kat'] : 1;
  33. if (($kat<1) || ($kat>$c)) $kat=1;
  34.  
  35. usort($tree,"sortuj");
  36.  
  37. foreach ($tree as $wart) {
  38. $w = explode("|",$wart);
  39. $cnt = count($w) - 2;
  40. if ($w[$cnt] == $kat) {$linia = $wart; break;}
  41. }
  42.  
  43. $linia = explode("|",$linia);
  44. array_pop($linia);
  45.  
  46. $linie = array();
  47.  
  48. for ($x=0;$x<$c;$x++) {
  49.  $dane = explode("|",$tree[$x]);
  50.  $cd = count($dane);
  51.  if (($cd>2) && (!in_array($dane[$cd - 3],$linia))) continue;
  52.  if ($x < $c - 1) {
  53. $next = explode("|",$tree[$x + 1]);
  54. if ($next[count($next) - 3] == $dane[$cd - 2]) { 
  55.  if (in_array($dane[$cd - 2],$linia))
  56.  { $linia_add = '<img src="images/kat_a.png" border="0" alt="menu" align="left" />&nbsp;'.$dane[$cd - 1]; }else {$linia_add = '<img src="images/kat_a.png" border="0" alt="menu" align="left" />&nbsp;'.$dane[count($dane) - 1];}
  57. } else {
  58.  $linia_add = '<img src="images/kat_b.png" border="0" alt="menu" align="left" />&nbsp;'.$dane[$cd - 1];
  59. }
  60.  } else $linia_add = '<img src="images/kat_b.png" border="0" alt="menu" align="left" />&nbsp;'.$dane[$cd - 1];
  61.  if ($kat == $dane[$cd - 2]) $linia_add = '<font color="#000000">'.$linia_add.'</font></td></tr>'; else
  62.  { $linia_add = '<a href="index.php?kat='.$dane[$cd - 2].'">'.$linia_add.'</a></td></tr>';}
  63.  $cd -= 2;
  64.  while ($cd > 0) { $linia_add = '<img src="images/0.gif" alt="menu" border="0" width="10" align="left" />'.$linia_add; $cd--;}
  65.  $linie[] = $linia_add;
  66. }
  67.  
  68. foreach ($linie as $wart) echo"$wartn";
  69. } else echo "<p>brak kategori</p>";
  70. ?>


Przykład MySQL

  1. INSERT INTO `menu` VALUES ('KAT 1', '1');
  2. INSERT INTO `menu` VALUES ('PODKAT 1', '1|2');
  3. INSERT INTO `menu` VALUES ('PODKAT 2', '1|3');
  4. INSERT INTO `menu` VALUES ('KAT 2', '2');
  5. INSERT INTO `menu` VALUES ('PODKAT 1', '2|4');
  6. INSERT INTO `menu` VALUES ('PODKAT 2', '2|5');


W tej chwili tylko kategoria pierwsza jest rozwinieta na starcie, czy da sie przerobic ten skrypt zeby glowne kategorie byly zawsze rozwiniete?

Z góry dziękuje za pomoc