Versio

array uitlezen in array

Overzicht Reageren

Merijn Venema

Merijn Venema

24/09/2009 03:03:00
Quote Anchor link
Beste leden,

Ik loop vast op een klein probleem. Kort de situatie:
Ik heb een hoofdmenu en een submenu. Dit submenu weet waar een item onder valt door middel van een parent id welke overeen komt met het id van een hoofdmenu item.

Nu heb ik een foreach lus gemaakt om het hoofdmenu te maken, maar nu wil ik kijken voor elk hoofdmenu item of er kinderen aanwezig zijn. Dus ik had een foreach lus en een if lus binnen de hoofd foreach lus geplaatst, maar het komt nooit uit. Of ik krijg alle resultaten terug, of ik krijg het max. hoofditem getal terug, en ga zo maar door.

Hoe moet ik dit oplossen?
 
PHP hulp

PHP hulp

23/05/2012 21:46:01
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
- SanThe -

- SanThe -

24/09/2009 06:02:00
Quote Anchor link
Code?
 
Jan Koehoorn

Jan Koehoorn

24/09/2009 07:56:00
Quote Anchor link
Opzet tabel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
CREATE TABLE menu_items (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  title varchar(255) NOT NULL,
  parent_id int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

Query om hoofditems (level1) en subitems (level2) op te halen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT
m1.title AS level1,
m2.title AS level2
FROM menu_items AS m1
LEFT JOIN menu_items AS m2 ON m2.parent_id = m1.id
 
Merijn Venema

Merijn Venema

24/09/2009 13:36:00
Quote Anchor link
Beste Jan, bedankt! Ik heb het principe van de joins nooit echt goed begrepen, maar die query zoals die er staat maakt een hoop duidelijk.

Echter, waar ik tegen aan loop, is dat ik niet weet hoe ik binnen deze query de juiste records kan tonen als parent_ id gelijk is aan het hoofditem.

Met andere woorden, als ik deze query gebruik ( ik krijg dan 3 records terug, wat goed is ), worden ze onder alle hoofd items weergegeven. Aangezien er 7 hoofditems zijn, krijg ik dus 21 keer iets. Terwijl het dus 3 moeten zijn, en deze moeten ook alleen onder 1 hoofditem vallen, niet alle.

///// kleine edit: misschien handig om te vermelden dat dit binnen codeIgniter is geschreven.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

// submenu genereren, dit valt binnen een foreach lus welke het normale
// menu genereert
// ps. de query komt wel goed terug, ik kan wel $r->parent_id opvragen! Dus ook
// dat moet kunnen.. maar nu..?


if($q = $this->page->menu($row->id)){
    echo "\n\t\t\t\t<ul>";
    foreach($q as $r){
        echo "\n\t\t\t\t\t" . '<li>' . "\n\t\t\t\t\t\t" .'<a href="' . $base . $r->url . '">&raquo; ';
        if($session == 'nl'){
            echo "\n\t\t\t\t\t\t" . $r->name_nl;
        }
else{
            echo "\n\t\t\t\t\t\t" . $r->name;
        }

        echo "\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>";
    }

    echo "\n\t\t\t\t</ul>";
}
[
/code]

Ik weet niet of dit helpt, en ik weet dat het niet echt netjes in,  maar in de bron ziet het er wel wat netter uit. Ik ga het nog opruimen, maar eerst zie ik het liefst dat het submenu ook werkt.
Gewijzigd op 01/01/1970 01:00:00 door Merijn Venema
 
Jan Koehoorn

Jan Koehoorn

24/09/2009 14:32:00
Quote Anchor link
Ik weet niet zeker of ik je goed begrijp, maar met deze query zou je de hoofditems op moeten halen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT id, title
FROM menu_items
WHERE ISNULL (parent_id)
ORDER BY title ASC

en met deze kun je per hoofditem de subitems ophalen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT id, title
FROM menu_items
WHERE parent_id = $parent_id
ORDER BY title ASC

Voor een goede uitleg over JOINS vind ik dit plaatje erg handig:
http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg
 
Robert Deiman

Robert Deiman

24/09/2009 14:44:00
Quote Anchor link
Mooi Plaatje is dat Jan! Lekker helder. Misschien moet ik de JOIN tutorial nog eens helemaal opnieuw gaan schrijven, en dan verder uitleggen met deze plaatjes.

Heb je 'n idee voor een goede tabelstructuur die zich hiervoor leent, zodat bij de verschillende mogelijkheden ook goede voorbeelden weer te geven zijn?
 
Jan Koehoorn

Jan Koehoorn

24/09/2009 14:47:00
Quote Anchor link
@ Robert: ik denk dat je een opzet zou moeten hebben waarin je alle mogelijkheden kunt laten zien. Misschien een tabel films, een tabel acteurs en een koppeltabel films_acteurs?

Het plaatje komt overigens van dit artikel:
http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
 
Merijn Venema

Merijn Venema

24/09/2009 15:01:00
Quote Anchor link
Beste Jan, zeker een handig plaatje! Heb met m`n opleiding nu ook te maken met JOINS, dus vandaar dat ik er uberhaupt al iets van snap, hiervoor nooit echt nodig gehad/ omwegen gecreerd voor mezelf om dit te kunnen vermijden.

Ik heb m`n probleem overigens ook al gevonden, eigenlijk was het vrij simpel. Het waren inderdaad de resultaten. Ik wou die query slechts in keer uitvoeren voor de foreach lus, maar dan krijg je dat je geen unieke vars kunt aanmaken in je lus, dus wordt er in elke lus die functie utigevoerd. Heb het nu door middel van die query`s kunnen oplossen!

bedankt nogmaals :)

// ps. kijk uit naar je nieuwe tut Robert
 



Overzicht Reageren