[PHP] Recursieve functie sitemap moet UL een class geven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo Tweakers,

ik ben bezig met een shop-systeem. Nu aangekomen bij de categorieen in het backend systeem, die categorien wil ik op zo'n manier weergeven: http://www.thestyleworks....temap/css-sitemap-07.html

Echter onderdersteund mijn functie dit niet, het probleem doet zich voor wanneer ik een laag dieper ga, dan moet hij aan de <li> een class meegeven, maar hoe doe ik dat. En hoe pas ik dit aan binnen deze functie? Zoals je ziet heb ik het geprobeerd door class='last' mee te geven als de parent groter is dan 1, ma dat is onzin, hoe kan dit wel?

Dank!

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<? 
function catalogus_list($parent) {
     $sql = "SELECT * FROM categorieen WHERE parent = '{$parent}';";
     $query = mysql_query($sql);
     if(mysql_num_rows($query) > 0) {
        print("<ul>");
        while($row = mysql_fetch_assoc($query)) {
              if($row['parent'] > 1){
              print("<li class='last'><a href='#'>{$row['naam']}</a></li>");
              catalogus_list($row['id']);
              } else {
              print("<li><a href='#'>{$row['naam']}</a></li>");
              catalogus_list($row['id']);
              }              
        }
        print("</ul>");
     }
}
?>

[ Voor 6% gewijzigd door Verwijderd op 08-02-2007 17:15 ]


Acties:
  • 0 Henk 'm!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Ik zou zoiets recursief oplossen omdat je van te voren niet weet hoe diep je moet gaan.

Dat doe je dus al zie ik.

[ Voor 17% gewijzigd door Y0ur1 op 08-02-2007 17:17 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik moet de children tellen, ma hoe?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt die functie toch gewoon een extra parameter meegeven? Bij de originele aanroep geef je "false" mee (bijvoorbeeld) en in de functie waar 'ie zichzelf aanroept (de recursie) geef je true mee. Zo moeilijk is dat toch niet?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@rob3,

Sorry, ma dit is al ver van mijn bed, als iemand mij de functie kan herschrijven dan weet ik voor de toekomst hoe ik dit verder oplos.. Maar dat gaat mij nu nog niet lukken.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 08 februari 2007 @ 17:20:
@rob3,

Sorry, ma dit is al ver van mijn bed, als iemand mij de functie kan herschrijven dan weet ik voor de toekomst hoe ik dit verder oplos.. Maar dat gaat mij nu nog niet lukken.
Dan zul je toch beter je best moeten doen en je in de materie verdiepen; we zitten hier niet in PRG om voor anderen oplossingen voor te kauwen; we wijzen je hooguit in de juiste richting ;)
Zie ook ons beleid betreffende scriptrequests.

En mijn naam is RobIII ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, script request, begrijp er veel van, ben er druk mee bezig, en als ik verder ben post ik het hier wel, want er zal wel nog iets gesleeuteld moeten worden anders zou ik het hier niet vragen..

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Het gaat er om dat je ons letterlijk vraagt of wij je script willen herschrijven, en daar kunnen we hier in PRG simpelweg niet aan beginnen; dan is het hek van de dam. Met een beetje debuggen (Debuggen: Hoe doe ik dat?) en gegeven tips moet je een heel eind kunnen komen. Je bent hier welkom om vragen te stellen; maar niet op de manier waarop je het nu doet ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben verder gaan denken, toen kwam ik hier op uit, maar dat moet korter kunnen, en dit werkt niet, waarom weet ik overigens niet:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?
function catalogus_list($parent) 
{
     $sql = "SELECT * FROM categorieen WHERE parent = '{$parent}';";
     $query = mysql_query($sql);
     $totaal = mysql_num_rows($query);
     $aanroep++;
     
     if($totaal > 0) 
     {
        if($totaal == $aanroep)
        {
            print("<ul class='last'>");
            while($row = mysql_fetch_assoc($query)) 
            {
                  $teller++;
                  if($teler == $totaal)
                  {
                      print("<li class='last'><a href='#'>{$row['naam']}</a></li>");
                      catalogus_list($row['id']);   
                  }  else {
                      print("<li><a href='#'>{$row['naam']}</a></li>");
                      catalogus_list($row['id']);
                  } 
                 
            }
            print("</ul>");
        }   
     } else {
            
            print("<ul>");
            while($row = mysql_fetch_assoc($query)) 
            {
                  $teller++;
                  if($teler == $totaal)
                  {
                      print("<li class='last'><a href='#'>{$row['naam']}</a></li>");
                      catalogus_list($row['id']);   
                  }  else {
                      print("<li><a href='#'>{$row['naam']}</a></li>");
                      catalogus_list($row['id']);
                  }     
            } 

     }
}
?>

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Sorry, maar "dat moet korter kunnen, en dit werkt niet, waarom weet ik overigens niet" is toch wel erg duidelijk: "ik heb geen zin om er zelf moeite in te steken, los het eens op". Wat bedoel je met "werkt niet"? Doet het helemaal niets? Werkt het niet in bepaalde randgevallen?

Je zult toch écht specifieker moeten zijn dan "werkt niet"; ik, en wij, hebben weinig trek om je code regel voor regel te gaan zitten analyseren en debuggen; dat kun je prima zelf als je her en daar wat variabelen op strategische plekken echo'd om te zien wat er gebeurt.

Iets wat mij al opvalt: wat doet de variabele "aanroep"? Wat verwacht je dat die doet? Want daar heb je in ieder geval al 1 probleem in zitten. Je moet eens goed kijken naar de scope van je variabelen en je even verdiepen in het idee achter recursie ;)

Daarnaast moet je eens goed kijken wat er in regel 6 t/m 11 gebeurt; die doet waarschijnlijk heel iets anders dan je bedoelt ;)

Overigens zou ik geen select * doen, maar alleen de velden die je nodig hebt. En je kunt natuurlijk, als je je query wat uitbreidt met een self-join natuurlijk ook meteen in de query zélf al het aantal children ophalen

[ Voor 68% gewijzigd door RobIII op 08-02-2007 18:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Wat je dus wilt is dat alleen de eerste keer <ul> wordt geprint. Dan doe je toch gewoon een parameter $isChild die voor de hoofdfunctie op false staat en voor de children op $true?

Dus iets van

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
25
26
27
28
29
30
31
<?php
function catalogus_list($parent, $isChild)
{

    $sql = "SELECT parent, id,  naam FROM categorieen WHERE parent = '{$parent}';";
    $query = mysql_query($sql);

    if(mysql_num_rows($query) > 0)
    {
        if($isChild == false)
            print("<ul>");
        while($row = mysql_fetch_assoc($query))
        {
            if($row['parent'] > 1)
            {
                print("<li class='last'><a href='#'>{$row['naam']}</a></li>");
                catalogus_list($row['id'], true);
            }

            else
            {
                print("<li><a href='#'>{$row['naam']}</a></li>");
                catalogus_list($row['id'], true);
            }              
        }
        
        if($isChild == false)
            print("</ul>");
     }
}
?>

offtopic:
Jeej, eerste post op GoT!

Acties:
  • 0 Henk 'm!

  • Coju
  • Registratie: Oktober 2000
  • Niet online
En wat voor een :)

Voor de TS: elke keer dat deze functie zichzelf aanroept wordt er ook een SELECT uitgevoerd. Als jouw lijst een beetje lang wordt krijg je problemen met de database. Zoek eens op wat database/php tutorials om wat wijzer te worden op het onderwerp. Scripten zonder te weten wat je doet is geen oplossing.
Pagina: 1