Nu ville jeg gerne i EN sql sætning, liste menu punkterne i den rigtige rækkefølge:
dvs. noget med en ORDER BY parent_id. Men for for hver parent_id , skal de menupunkter der er tilknyttet via parent_id = id nummeret, listes efterfølgende..
Jeg skrev det som jeg gjorde fordi jeg ikke vidste hvilket sprog du programmerer i. ;-)
Og jeg har ikke selv erfaring med PHP.
ideen er at du har en metode der udskriver alle linier med det id den bliver kaldt. Samtidig vil den for hver udskrevet linie kalde sig selv med den udskrevne linies ID.
Ved at kalde denne metode først med id = 0, vil du opnå en rekursiv effekt hvor alt udskrives:
fra ovenstående eksempel:
1) udskriv resultet af hent_linier(0)
i hent linier vil vi nu få følgende recordset: id name parent_id placement 1 codebase1 0 1 2 codebase2 0 2 8 codebase3 0 3
og metoden vil arbejde sig igennem ved først at returnere 1 codebase1 0 1 og herefter udskrive hent_linier(1)
altså er vi nu igen i toppen af en ny instans af hent linier, og vi vil få fat i følgende recordset:
id name parent_id placement 3 codebase1.1 1 1 4 codebase1.2 1 2
altså vil vi returnere 3 codebase1.1 1 1 samt returnere resultatet af hent_linier(3)
Den nye udgave af hent_linler vil få et tomt recordset (ingen poster har parent_id=3) og vil altså ikke returnere noget.
så er vi tilbage i hent_linier fra før og returnerer nu den næste post 4 codebase1.2 1 2 og hent_lininer(4) kaldes ...
Er du med? ellers kan jeg næsten ikke forklare det nærmere....
Jeg er ikke 100% sikker på hvordan det du har lavet fungerer, men umiddelbartvil jeg synes dette ville være nemmere:
$index = 0; // Bemærk denne skulle gerne være \"global\".
function hent_linier($id) { $sql=\"SELECT DISTINCT menu.id, menu.name , menu.parent_id, menu.placement FROM menu WHERE parent_id = \'$id\' ORDER BY parent_id ASC , placement ASC\"; $result = mysql_query(\"$sql\"); for( ; $row = mysql_fetch_object($result);$index++) { $array[$index][0]=$row->id; $array[$j][1]=$row->name; hent_linier($row->id); } }
function hent_alt() { hent_linier(0); }
//
Frem for at returnerere delresultaterne har jeg nu lavet så det gemmes i et globalt array (Dette skal nok erklæres - er ikke helt sikker på hvordan det skal gøres i PHP :)
Det ville naturligvis være mere elegant at bruge \"return\" metoden, men jeg ved ikke lige hvordan vi let kan kopiere indholdet af et array over i et andet, men hvis det er muligt så kan en lille ændring til det du har være at udskifte følgende:
$subarray = hent_linier($row->id);
$array[$j][2]= hent_linier($row->id);
med
$subarray = hent_linier($row->id);
for hvert element i $subarray, kopier det til $array.
Som det er lige nu lægger du tilsyneladende X-elementer (et array) ind på et enkelt elements plads.
Tak for pointsene, jeg håber da bestemt at du kan bruge om ikke metoden så ideen i fremtiden!
Jeg tror ikke det er muligt at løse dette med almindelige SQL-komandoer pga. det rekursive element, men det er da meget tænkeligt at man kunne lave noget smart med \"stored procedures\" som jeg dog overhovedet ikke selv har arbejdet med.
jeg opretter lige et spg. så du kan få 30 points, for dit svar..
Jeg syntes, det er lidt \'kuku\', den måde funktionen virker på, og har svært ved at forstå det... :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.