Avatar billede Slettet bruger
23. februar 2004 - 16:39 Der er 9 kommentarer og
1 løsning

Rekursiv funktion til at udskrive breadcrumb/sitemap

Hej!

Jeg har forsøgt at lave en rekursiv funktion der kan behandle nogle arrays med informationer.

Det jeg gør er at trække alt ud af databasen i et hug, for at forsøge at opstille det med PHP.

Jeg ønsker at følgende arrays:

$id_arr =         Array('1','2','5','9','11','14');
$ejerid_arr =         Array('0','1','0','5','1','0');
$overskrift_arr =     Array('Skærme','Sony','Grafikkort','Matrox','Philips','Harddiske');

Skal opstilles på denne måde:

Skærme > Sony
Skærme > Philips
Grafikkort > Matrox
Harddiske


Det er den traditionelle struktur med et id, et ejerid og et navn
Avatar billede Slettet bruger
23. februar 2004 - 16:41 #1
Rent praktisk skal det hældes idn i en selectbox, så det ville være fint hvis jeg kunne få den til at se sådan her ud:

<option value="1,2">Skærme > Sony</option>
<option value="1,11">Skærme > Philips</option>
<option value="5,9">Grafikkort > Matrox</option>
<option value="14">Harddiske</option>
Avatar billede tjp Mester
24. februar 2004 - 00:51 #2
Det er mig lidt uklart, hvad det er du søger svar på! *S*
Avatar billede Slettet bruger
24. februar 2004 - 09:20 #3
Synes nu ellers det fremgår ret klart.
Avatar billede Slettet bruger
24. februar 2004 - 18:27 #4
Nu har jeg foreløbig prøvet med dette her, der dog har den ulempe at det udskrives direkte til skærmen, og jeg vil gerne have lidt mere kontrol over tingene.

Desuden udskrives det baglæns :D

<?

$id_arr =             Array('1'        ,'2'    ,'12'            ,'26'        ,'9'        ,'14'        ,'15');
$ejerid_arr =         Array('0'        ,'1'    ,'0'            ,'12'        ,'1'        ,'0'        ,'2');
$overskrift_arr =     Array('Skærme'    ,'Sony'    ,'Grafikkort'    ,'Matrox'    ,'Philips'    ,'Harddiske','CRT');

function get_parent($node) {

global $id_arr;
global $ejerid_arr;
global $overskrift_arr;
global $endelig_udskrift;
$i = 0;

echo $overskrift_arr[$node];

foreach($id_arr AS $element) {

    if($element == $id_arr[$node]) {

    if($ejerid_arr[$node] == 0) {
        echo $overskrift[$node];
    } else {
        echo " < " . $overskrift[$node];
    }
    if($ejerid_arr[$node] == 0) {
        echo "<br>$overskrift_arr[$node]<br>";
    }
    get_parent($ejerid_arr[$node]-1);
    }
    $i++;
}

}


for($i = count($id_arr);$i>0;$i--) {
    get_parent($i);
}
?>
Avatar billede tjp Mester
24. februar 2004 - 21:47 #5
Jeg har kun lige skimmet din kode og ved derfor ikke om det er muligt, men hvis du talte op i stedet for ned i sidste for-løkke ville det så ikke komme ud i stigende rækkefølge?
Avatar billede Slettet bruger
24. februar 2004 - 22:28 #6
Hej!

Der går et eller andet i kage hvis jeg skriver ud den anden vej, men for så vidt gør det ikke noget som det er.

Mit primære ønske var at kunne trække tingene ud i et enkelt array, som jeg så kunne sortere på og luse ud i gengangere.

Pt. udskriver min kode det her:

CRT < Sony < Skærme
Skærme
Harddiske
Harddiske
Philips < Skærme
Skærme
Matrox < Grafikkort
Grafikkort
Sony < Skærme
Skærme

Herfra vil jeg

1. lægger hver "streng" ind i et samlet array
2. luse ud i gengangere
3. Vende hele strengen, så de kommer i rigtig rækkefølge
4. sortere lidt, så det bliver:
Skærme
Skærme > Philips
Skærme > Sony
Skærme > Sony > CRT
Avatar billede tjp Mester
24. februar 2004 - 23:24 #7
Nu har jeg kigget en smule mere på koden:
Hvad bruges $i til inde i get_parent?
Hvordan skal dine arrays egentlig forstås?
Er der nogen speciel grund til at benytte rekursion?
Kort sagt, hvad er det præcis du vil? *S*
Avatar billede Slettet bruger
25. februar 2004 - 08:42 #8
Der fik du mig ;)

Ej, $i skal du blot se bort fra, et levn fra tidligere forsøg :)

Mine arrays er såmænd simple nok:

Hver kategori har et id, et ejerid og en overskrift.

Et ejerid kan godt have flere "børn" altså id's under sig. Et id kan kun have en "far" altså kun et ejerid.

Grunden til at bruge en rekursiv funktion er at jeg regner med at få omkring 240 kategorier.

Skulle man lave det med et SQL-kald til hver kategori er det 240 kald. Ikke fedt. Her nøjes jeg med et kald, og lader PHP klare resten.

Det jeg vil er i bund og grund det som Eksperten har under "Opret spørgsmål"

Her er alle kategorier og deres underkategorier listet op.

Jeg vil også bruge det til at udskrive en breadcrumb på den side jeg står på, så man kan se at man er på Forsiden > Skærme > Sony > CRT osv.
Avatar billede Slettet bruger
25. februar 2004 - 14:29 #9
Nu har jeg faktisk bikset noget sammen der virker, koden er ikke køn men hvad ;)

Herunder er den, demosite/db.php er blot en MySQL connection, samt en enkelt variabel, der hedder $kunde.

<?
include('demosite/db.php');

$id_arr[0] =             Array('999');
$ejerid_arr[0] =         Array('0');
$overskrift_arr[0] =     Array('Tom og ligegyldig plads');

$id_arr[1] =             Array('999');
$ejerid_arr[1] =         Array('0');
$overskrift_arr[1] =     Array('Tom og ligegyldig plads');

///Kan ikke helt regne ud hvorfor der skal fyldes 2 elementer i for at det går op i den sidste ende :/

$sql = 'SELECT id, overskrift, ejerid FROM ' . $kundenavn . '_dokument_kategorier';
$result = mysql_query($sql) or die(mysql_error());

while($row = mysql_fetch_array($result)) {
$id_arr[] =             $row['id'];
$ejerid_arr[] =         $row['ejerid'];
$overskrift_arr[] =     $row['overskrift'];

}

function get_parent($node, $nummer) {
global $id_arr;
global $ejerid_arr;
global $overskrift_arr;
global $endelig_udskrift;

$node = $node;
$i = 1;
foreach($id_arr AS $element) {
    if($id_arr[$i] == $node) { //Hvis id svarer til til det nuværende element skal det udskrives, og dets ejer skal kaldes
$endelig_udskrift[$nummer][] = $overskrift_arr[$i];
    get_parent($ejerid_arr[$i], $nummer); //hent ejerid
    }
$i++;
}

}


function udskriv_menu() {

global $id_arr;
global $endelig_udskrift;

    for($i = 0;$i < count($id_arr);$i++) {
    get_parent($id_arr[$i], $i2);
    $i2++;
    }
    for($i = 1; $i < count($id_arr);$i++) {
    $endelig_udskrift[$i] = array_reverse($endelig_udskrift[$i]);
    $endelig_udskrift2[] = implode(" &raquo; ", $endelig_udskrift[$i]);
    }
    sort($endelig_udskrift2);
    for($i = 1;$i <= count($endelig_udskrift2);$i++) {
    echo $endelig_udskrift2[$i] . "<br>";
    }
}

udskriv_menu();

?>
Avatar billede Slettet bruger
28. februar 2004 - 23:42 #10
lukker
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester