[PHP] Recursieve functie output geen xhtml correct lijst

Pagina: 1
Acties:

Onderwerpen


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
In een mysql database heb ik een parent-child relatie tabel. Deze tabel wil ik recursief uitlezen en in een xhtml correct lijst weergeven, om een sitemap te genereren. Ik heb alleen problemen met de afsluitende <li>. Als er namelijk nog kinderen onder de huidige node hangen, moet mag die <li> nog niet afgesloten worden - dit gebeurt echter wel. Ik heb de afsluitende </li> tag al all over de functie gehad, maar kom er niet uit. Wie helpt mij op weg?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function sitemap_form($pid=1, $level=0)
{
  static $output;

  $result = db_query("SELECT * FROM nodes WHERE pid = %d ORDER BY weight ASC", $pid);
  $endul  = ($level != 0) ? '</ul></li>' : '</ul>';
  
  if (db_num_rows($result) != 0)
  {
    $endli = '';
    $output .= '<ul>';

    for ($i = 0; $i < db_num_rows($result); $i++)
    {
      $node   = db_fetch_array($result);      
      $href   = ($node['alias']) ? $node['alias'] : $node['nid'];
      $output.= '<li><a href="'.$href.'">'.$node['title'].'</a>';
      sitemap_form($node['nid'], $level+1);
      $output.= '</li>';
    }
    $output.= $endul;
  }
  return $output;
}

Dit genereert echter een </li> teveel:
HTML:
1
2
3
4
5
6
7
8
9
10
11
<ul>
<li><a href="oplossingen">oplossingen</a>
  <ul>
  <li><a href="62">A</a></li>
  <li><a href="63">B</a></li>
</ul>
</li>
</li> <------------
<li><a href="sitemap">Sitemap</a></li>
<li><a href="61">nieuwe pagina</a></li>
</ul>

Iemand een idee hoe ik dit kan oplossen. Het probleem is dat ik niet elke <li> direct kan afsluiten. Hij moet namelijk 'open' blijven tot ik zeker weet dat hij geen kinderen heeft. Dan pas kan ik een </li> zetten... :/

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • coubertin119
  • Registratie: Augustus 2002
  • Laatst online: 15-09 17:06
Kan je geen gebruik maken van DOMXML? Geen geneuzel met open/gesloten tags :).

Skat! Skat! Skat!


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Waarom geef je de output niet steeds terug:
code:
1
2
3
4
5
6
7
8
function node($start){
  out=<ul>
    out=<li>
       out=node(volgende item);
    out=<li>
  out=</ul>
  return out;
}

Verwijderd

of je zou natuurlijk kunnen nesten:

Zolang er nog nodes zijn (

doe dit ),

<geen childs meer?> ( voeg dan de sluit-tag toe)

ps: kijkend naar je code dus het volgende:

Je gehele functie staat in de if-functie. Als je na je "for" functie nu eens simpel een sluit-tag toevoegt aan je "output" ben je toch klaar?

[ Voor 44% gewijzigd door Verwijderd op 16-09-2004 19:25 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij is die regel met
PHP:
1
$endul  = ($level != 0) ? '</ul></li>' : '</ul>';

de boosdoener. Haal die es weg, wat gebeurt er dan?
edit:
Ik bedoel natuurlijk alleen de </li>

[ Voor 27% gewijzigd door bigbeng op 16-09-2004 19:53 ]


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
En de winner is bigbeng :D Zo simpel - en zo effectief! Soms denk je gewoon te moeilijk...

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."

Pagina: 1