[PHP] Recursieve functie met tabel in tabel voor elke laag

Pagina: 1
Acties:
  • 59 views sinds 30-01-2008

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb nu het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$navitems[1] = Array( parent=>0, name=>'Home',   href=>''); 
$navitems[2] = Array( parent=>0, name=>'Appels', href=>'appels.php' ); 
$navitems[3] = Array( parent=>2, name=>'Rood',   href=>'rood.php' ); 
$navitems[4] = Array( parent=>2, name=>'Groen',  href=>'groen.php'); 
$navitems[5] = Array( parent=>0, name=>'Peren',  href=>'peren.php'); 


function buildMenu($menuItems, $curItem, $depth)
{ 
  foreach ($menuItems as $itemKey=>$item)
  { 
    if ($item['parent']==$curItem) 
    {
      echo '<tr><td>+</td><td>'.$item['name'].'</td></tr>';
      buildMenu($menuItems, $itemKey, $depth + 1); 
    }     
  } 
} 

echo '<table border="1">';
buildMenu($navitems, 0, 0); 
echo'</table>';

Dit geeft de linker output. Ik wil alleen graag een output als rechts: een nieuwe tabel in een cel, voor elke laag:
Afbeeldingslocatie: http://www.danandan.luna.nl/tabel.jpg
Sommigen zullen zeggen "maar toch een (un)ordered list en pas die aan met css!". Dat is een goede opmerking, maar toch wil ik het in dit geval graag op deze manier :)

Ik heb geen idee hoe te beginnen. Ik heb al dingen geprobeerd als
PHP:
1
echo '<table border="1">'.buildMenu($menuItems, $itemKey, $depth + 1).'</table>';

maar dit levert niet het goede resultaat op. Wie helpt mij op weg?

[ Voor 32% gewijzigd door Reveller op 04-10-2004 16:16 ]

"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."


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
lama

[ Voor 143% gewijzigd door Michali op 04-10-2004 16:23 ]

Noushka's Magnificent Dream | Unity


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
^^ Had ik dus ook al geprobeerd, maar dat werkt niet...

"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."


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
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
function buildMenu($menuItems, $curItem, $depth)
{
  $first = true;
  foreach ($menuItems as $itemKey=>$item)
  {
    if ($item['parent']==$curItem)
    {
    if ( $first )
    {
      if ( $depth > 0 )
      {
        echo '<tr><td></td><td>';   
      }
      
        echo '<table border="1">';
        $first = false;
    }
    
      echo '<tr><td>+</td><td>'. $item['name'] . '</td></tr>';
      buildMenu($menuItems, $itemKey, $depth + 1);
    }     
  }
  
  if ( !$first )
  {
    echo'</table>';
    
    if ( $depth > 0 )
    {
      echo '</td></tr>';
    }
  }
}

buildMenu($navitems, 0, 0);


Dit dan? Nog niet getest.

[ Voor 43% gewijzigd door Michali op 04-10-2004 16:28 ]

Noushka's Magnificent Dream | Unity


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Michali - dit werkt perfect :) Je bent de held van de dag. Helemaal snappen doe ik het nog niet. Ik ga eens goed bestuderen wat je nu gedaan hebt :) Dank je!

"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."


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 20:41
offtopic:
In dit geval is een lijst misschien wel wat netter wat betreft je HTML output.

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Dankzij Michali heb ik nu het volgende:
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
$navitems[1] = Array( parent=>0, name=>'Home',   href=>''); 
$navitems[2] = Array( parent=>0, name=>'Appels', href=>'appels.php' ); 
$navitems[3] = Array( parent=>2, name=>'Rood',   href=>'rood.php' ); 
$navitems[4] = Array( parent=>2, name=>'Groen',  href=>'groen.php'); 
$navitems[5] = Array( parent=>0, name=>'Peren',  href=>'peren.php'); 

function buildMenu($menuItems, $curItem, $depth) 
{ 
  $first = true; 
  foreach ($menuItems as $itemKey=>$item) 
  { 
    if ($item['parent']==$curItem) 
    { 
      if ( $first ) 
      { 
        if ( $depth > 0 ) 
        { 
          echo '<tr><td>&nbsp;</td><td>';     
        } 
         
        echo '<table border="1">'; 
        $first = false; 
      } 
       
      echo '<tr><td>+</td><td>'. $item['name'] . '</td></tr>'; 
      buildMenu($menuItems, $itemKey, $depth + 1); 
    }      
  } 
   
  if ( !$first ) 
  { 
    echo'</table>'; 
     
      if ( $depth > 0 ) 
      { 
        echo '</td></tr>'; 
      } 
  } 
} 

buildMenu($navitems, 0, 0);

Dit werkt perfect en genereert een lijst ik wil. Alleen: standaard staan alle menu items "open". Hoe zou ik moeten beginnen als ik submenu's pas open wil hebben als ik erop klik? Dus:
Afbeeldingslocatie: http://www.danandan.luna.nl/menu.gif
PHP:
1
buildMenu($navitems, 0, 0, 2) <-- parent 2 open?

"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."


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 20:41
Zoiets?
Cascading Stylesheet:
1
2
3
.submenu{
  display:none;
}

JavaScript:
1
2
3
function submenu(id){
  document.getElementById(id).style.display='block';
}

HTML:
1
2
3
4
5
6
7
8
<ul>
  <li><a href="" onclick="submenu('sub2');return false;">Appels</a>
    <ul class="submenu" id="sub2">
       <li>rood</li>
       <li>groen</li>
    </ul>
  </li>
</ul>

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07-2025
Reveller schreef op 04 oktober 2004 @ 17:42:

[knip]

Dit werkt perfect en genereert een lijst ik wil. Alleen: standaard staan alle menu items "open". Hoe zou ik moeten beginnen als ik submenu's pas open wil hebben als ik erop klik? Dus:
[afbeelding]
Je kan hierbij kiezen, met php of met javascript.
In beide gevallen werkt een list denk ik idd wat makkelijker.

Maar met tabellen zou ik het zoiets doen:


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
<?
$navitems[1] = Array( parent=>0, name=>'Home',   href=>''); 
$navitems[2] = Array( parent=>0, name=>'Appels', href=>'appels.php' ); 
$navitems[3] = Array( parent=>2, name=>'Rood',   href=>'rood.php' ); 
$navitems[4] = Array( parent=>2, name=>'Groen',  href=>'groen.php'); 
$navitems[5] = Array( parent=>0, name=>'Peren',  href=>'peren.php'); 

$unfoldItems = Array(2);

function buildMenu($menuItems, $curItem, $depth, $unfoldItems) 
{ 
  $first = true; 
  foreach ($menuItems as $itemKey=>$item) 
  { 
    if ($item['parent']==$curItem and ($item['parent'] == 0 or in_array($item['parent'], $unfoldItems) ) )
    { 
      if ( $first ) 
      { 
        if ( $depth > 0 ) 
        { 
          echo '<tr><td>&nbsp;</td><td>';      
        } 
          
        echo '<table border="1">'; 
        $first = false; 
      } 
        
      echo '<tr><td>+</td><td>'. $item['name'] . '</td></tr>'; 
      buildMenu($menuItems, $itemKey, $depth + 1, $unfoldItems); 
    }       
  } 
    
  if ( !$first ) 
  { 
    echo'</table>'; 
      
      if ( $depth > 0 ) 
      { 
        echo '</td></tr>'; 
      } 
  } 
} 

buildMenu($navitems, 0, 0, $unfoldItems); 
?>

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Mja, dit begint wel erg een helpdesk topic te worden op deze manier. Het is hier niet de bedoeling dat je iedereen het werk voor je laat doen, daar hebben we google voor.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1

Dit topic is gesloten.