[PHP] Controleren of array-element kinderen heeft

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb een array als hieronder en wil een functie maken die een navigatie menuutje terug geeft.
PHP:
1
2
3
4
5
6
7
8
$navitems[1]  = Array('parent'=> 0, 'title'=>'Home',      'alias'=>'/'); 
$navitems[4]  = Array('parent'=> 0, 'title'=>'Contact',   'alias'=>'contact/');
$navitems[11] = Array('parent'=> 0, 'title'=>'Over',      'alias'=>'over/');
$navitems[16] = Array('parent'=> 4, 'title'=>'Aanmelden', 'alias'=>'contact/aanmelden');
$navitems[18] = Array('parent'=> 4, 'title'=>'Vragen',    'alias'=>'contact/vragen');
$navitems[19] = Array('parent'=>11, 'title'=>'Route',     'alias'=>'over/route');
$navitems[20] = Array('parent'=>11, 'title'=>'Producten', 'alias'=>'over/producten');
$navitems[21] = Array('parent'=>19, 'title'=>'Auto',      'alias'=>'over/route/auto');

De functie moet drie mogelijke outputs geven:
  • als $activeItem kinderen heeft, kinderen laten zien. Bijvoorbeeld als iemand op "Contact" klikt, moet de functie "Aanmelden" en "Vragen" teruggeven;
  • als $activeItem geen kinderen heeft, maar wel broertjes (=nodes met zelfde parent), dan deze laten zien (inclusief hemzelf). Bijvoorbeeld: klik op "Aanmelden" retourneert "Aanmelden" en "Vragen"
  • als $activeItem geen kinderen en broertjes heeft, niets laten zien. Bijvoorbeeld klikken op "Auto" retourneert niks
Op het moment heb ik onderstaande code. Logischerwijs retourneert deze alleen in het eerste geval. Ik heb moeite om geval 2 en 3 te implementeren. Mijn grootste probleem: hoe kijk ik binnen deze functie of een node kinderen heeft?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function buildSub($menuItems, $activeItem) 
{
  static $output;
  
  foreach ($menuItems as $itemKey=>$item) 
  {
    if ($item['pid'] == $activeItem)
    { 
      if ($activeItem == $itemKey)
        $output.= '<li class="on"><a href="'.$item['alias'].'">'.$item['title'].'</a>';
      else
        $output.= '<li class="off"><a href="'.$item['alias'].'">'.$item['title'].'</a>';
    }
  } 
  return '<div id="subnav"><ul>'.$output.'</ul></div>';
}

Wie kan mij op weg helpen?

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


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Reveller schreef op 07 november 2004 @ 15:26:
Mijn grootste probleem: hoe kijk ik binnen deze functie of een node kinderen heeft?
Bij elke node kijken naar het parent veld van elke andere node lijkt me de enige logische manier.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Je beginnetje is goed, maar je moet even recursiviteit in je functie knallen.

kortom:

• in je loopje checken met is_array of er children in de array zitten
• dan dezelfde $output .= buildSub($child) functie aanroepen.

dan loopt je functie autoamgisch je hele tree door :)

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07 18:43
Het grootste deel heb je zelf al, alleen wanneer hij de eerste keer niets vindt, moet hij een stap terug doen (de parent van de huidige node controleren), als hij hierbij vervolgens alleen zichzelf terug vindt kan je false o.i.d. returnen.

De static variable heb ik even weggehaald, aangezien ik niet weet of dat wel de bedoeling is :).

zoiets :)
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
function buildSub($menuItems, $activeItem)
{
  //static $output;

  $subItems = getChildNodes(&$menuItems, $activeItem);
  if (count($childNodes) == 0) // wanneer geen childs
  {
    $subItems = getChildNodes(&$menuItems, $menuItems[$activeItem]['parent']);
    if (count($subItems) <= 1) // wanneer geen buren
    {
      return false;
    }
  }

  foreach ($subItems as $itemKey=>$item)
  {
    if ($activeItem == $itemKey)
      $output.= '<li class="on"><a href="'.$item['alias'].'">'.$item['title'].'</a>';
    else
      $output.= '<li class="off"><a href="'.$item['alias'].'">'.$item['title'].'</a>';
  }
  return '<div id="subnav"><ul>'.$output.'</ul></div>';
}

function getChildNodes($menuItems, $ItemId)
{
  $childNodes = array();
  foreach ($menuItems as $itemKey=>$item)
    if ($item['parent'] == $ItemId)
      $childNodes[] = $item;

  return $childNodes;
}

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
pjotrk schreef op 07 november 2004 @ 16:28:
[...] zoiets :)
PHP:
1
2
3
4
function buildSub($menuItems, $activeItem)
{

  //code...
Jouw code heeft eenzelfde probleem als waar ik al eerder mee zat: als een node wel buren maar geen kinderen heeft, geeft de functie geen overzicht van die buren terug. Ik ben de afgelopen tijd met jouw code bezig geweest, maar snap niet waarom hij in dat geval niets teruggeeft. Immers:
PHP:
1
if (count($subItems) <= 1) // wanneer geen buren
wordt wel goed verwerkt. Wie biedt een uitkomst?

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


Acties:
  • 0 Henk 'm!

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07 18:43
ah ik zie het geloof ik al:

- regel 6: if (count($childNodes) == 0) // wanneer geen childs
($childnodes bestaat niet eens daar :).)
- ook voor de netheid zou $output nog geset moeten worden: $output = "";
(anders wordt plakken aan lege string zo lastig :))


resultaat hier:

echo buildSub(&$navitems, 1);
// wel buren, geen childs
Home
Contact
Over

--------------------------------------------------------------------------------
echo buildSub(&$navitems, 4);
// wel childs, ook buren
Aanmelden
Vragen

--------------------------------------------------------------------------------
echo buildSub(&$navitems, 11);
// geen childs, geen buren
Route
Producten

--------------------------------------------------------------------------------
echo buildSub(&$navitems, 21);
// geen childs, geen buren
Pagina: 1