Avatar billede mik789 Nybegynder
11. november 2003 - 09:50 Der er 14 kommentarer og
1 løsning

foreach løkke i multidimensionalt array

Jeg sidder og bakser med en indholdsfortegnelse til et tidsskrift. Nu forenkler jeg problemet:

Der er fire typer af tekster:

Redaktionelt
Artikler
Anmeldelser
Nyudgivelser

Disse fire fungerer samtidig som overskrifter under hvilke de enkelte artikler listes som links til artikelsiden der automatisk opdateres med den pågældende artikels ID sendt i querystrengen. Der er bare det ved det at den første og den sidste type altid kun har én artikle og denne har hverken angivelse af forfatter eller titel. De to øvrige har både forfatter og titel. Derfor skal typen/overskriften Redaktionelt og Nyudgivelser i sig selv fungere som link i modsætning til de to midterste.

I databasen er hver artikel defineret under felterne ID, type, forfatter og titel. Der kan være flere artikler med samme type, men de har alle en unik ID, og som sagt er der to artikler (første og sidste) der kun har indhold i felterne ID og type, mens de to andre felter tomme.

For at vise artiklerne under de rigtige overskrifter/typer genereres et multidimensionelt array ved gennemløb af databasen (hvor $countArts er antal rækker):

for ($i=0; $i<$countArts; $i++) {
  $arrayArts = mysql_fetch_array($resultArts);
  $list[$arrayArts[type]][]=$arrayArts;
}

Hvis nu alle artikler havde en titel (så det for alle typer kun er titlerne der fungerer som links), ville det være nemt nok. Så kunne listen generes således:

foreach ($list as $key => $val) {
  echo "<p>$key</p>\n";
  foreach ($val as $arrayArts) {
    echo "<p><a href=\"visArtikel.php?ID=$arrayArts[ID]\">$arrayArts[forfatter], $arrayArts[titel]</a>\n";
  }
  echo "</p>\n";
}

Men så nemt er det ikke fordi første og sidste type jo ikke har nogen artikler med forfatter og titel, men derfor selv skal fungere som links.

Så - NU KOMMER SPØRGSMÅLET SÅ ENDELIG ;-)

Hvordan får jeg adgang til felterne i $arrayArts allerede i føreste foreach løkke, så jeg kunne få noget i retning af dette (der IKKE fungerer):

foreach ($list as $key => $val) {
  if( ...artiklerne under denne type har ingen titel...) {
  echo "<p><a href=\"visArtikel.php?ID=$arrayArts[ID]\">$key</a></p>\n";
  }else{
  echo "<p>$key</p>\n";
    foreach ($val as $arrayArts) {
    echo "<p><a href=\"visArtikel.php?ID=$arrayArts[ID]\">$arrayArts[forfatter], $arrayArts[titel]</a>\n";
    }
  echo "</p>\n";
  }
}

//mik
Avatar billede mik789 Nybegynder
11. november 2003 - 10:06 #1
For lige at gøre det nemmere at se det for sig skal den endelige liste jo se ud sådan her (forkortet):

<p><a href="...php?ID=1">Redaktionelt</a></p>

<p>Artikler</p>
<p><a href="...php?ID=2">S. Sørensen, Artikel blabla</a></p>
<p><a href="...php?ID=3">M. Madsen, Artikel mumlemumle</a></p>

<p>Anmelser</p>
<p><a href="...php?ID=4">P. Petersen, Anmeldelse sluddersladder</a></p>
<p><a href="...php?ID=5">J. Jensen, Anmeldelse våsevåse</a></p>

<p><a href="...php?ID=6">Nyudgivelser</a></p>
Avatar billede avminarm Juniormester
11. november 2003 - 10:36 #2
Jeg er ikke helt sikke på hvad du mener, men kunne du ikke i din database give dine typer uden artikel eller forfatter en default værdi i databasen.
Avatar billede mik789 Nybegynder
11. november 2003 - 10:49 #3
avminarm> Jo, den første kunne jeg godt, for den har altid ID=1, så i stedet for bare at kalde den Redaktionelt kunne jeg kalde den <a href="visArtikel.php?ID=1">Redaktionelt</a>. Men den går jo ikke med den sidste hvis ID jeg ikke kender (men som = $countArts - men hvordan for jeg det tilsvarende ind i databasen - kan et felt referere til sit eget rækkenummer???)
Avatar billede avminarm Juniormester
11. november 2003 - 10:52 #4
den sidste er det nyudgivelser?? - det jeg mener er at man kunne for disse sætte en værdi ind i DB når man opretter ny udgivelsen såm altid f.eks er "ikkenogether" - derved vil man kunne finde alle dem der har denne nøgle i f.eks forfatter, men kan du vise et dump af din DB
Avatar billede mik789 Nybegynder
11. november 2003 - 11:09 #5
avminarm> Tabellens struktur er denne (forenklet efter mit eksempel ovenfor):

ID (int primary) | type (varchar not null) | forfatter (varchar NULL) | titel (varchar NULL

Og indholdet ser sådan ud:

1 | Redaktionelt | NULL | NULL
2 | Artikler | S. Sørensen | Artikel blabla
3 | Artikler | M. Madsen | Artikel mumlemumle
4 | Anmeldelser | P. Petersen | Anmeldelse sluddersladder
5 | Anmelser | J. Jensen | Anmeldelse våsevåse
6 | Nyudgivelser | NULL | NULL
Avatar billede mik789 Nybegynder
11. november 2003 - 11:28 #6
Ups fejl i række 5. Skal selvfølgelig være:

5 | Anmeldelser | J. Jensen | Anmeldelse våsevåse
Avatar billede avminarm Juniormester
11. november 2003 - 12:04 #7
kunne man så ikke have f.eks:

1 | Redaktionelt | red | red
2 | Artikler | S. Sørensen | Artikel blabla
3 | Artikler | M. Madsen | Artikel mumlemumle
4 | Anmeldelser | P. Petersen | Anmeldelse sluddersladder
5 | Anmelser | J. Jensen | Anmeldelse våsevåse
6 | Nyudgivelser | nyud | nyud

Det handler jo blot om hvad der indsættes i DB ved oprettetse

Du vil jo have de unikke id 1-6, men vil kunne finde alle nyudgivelse ved at selecte WHERE forfatter = 'nyud'
Avatar billede mik789 Nybegynder
11. november 2003 - 12:40 #8
avminarm> måske nok, men der er det problem at jeg henter fra tabellen mange andre steder på sitet, og når så felterne forfatter og titel er udfyldt med "red" og "nyud" risikerer jeg at de hentes som sådan hvor der skulle være tomt.

Men jeg har lavet en workaround der virker selv om den ikke er særlig elegant:

foreach ($list as $key => $val) {
  if($key=="Redaktionelt") { //har jo altid ID=1
    echo "<p><a href=\"visArtikel.php?ID=1\">$key</a></p>\n";
  }elseif($key=="Artikler"||$key=="Anmeldelser"){
    echo "<p>$key</p>\n";
    foreach ($val as $arrayArts) {
    echo "<p><a href=\"visArtikel.php?ID=$arrayArts[ID]\">$arrayArts[forfatter], $arrayArts[titel]</a>\n";
    }
    echo "</p>\n";
  }elseif($key=="Nyudgivelser"){ // har jo altid ID=$countArts
    echo "<p><a href=\"visArtikel.php?ID=$countArts\">$key</a></p>\n";
  }
}

Men det ville være bedre hvis koden kunne gøres uafhængig af de faktiske strengværdier....
Avatar billede avminarm Juniormester
11. november 2003 - 13:39 #9
de andre steder på sitet hvor du henter kan du jo ligeledes sortere fra hvis forfatter = "red" osv.

alternativt kunne du lave en kolonne mere i din DBtabel som hedder f.eks. blank og så sætte et 0 hvis forfatter og titel ej er udfyldt og et 1 tal hvis de er og så selecete ud fra det.
Avatar billede mik789 Nybegynder
21. november 2003 - 09:57 #10
lukker
Avatar billede avminarm Juniormester
21. november 2003 - 09:59 #11
rigtig pænt selv at tage points!!! og hvad har du fundet ud af - virker det eller hvad? og selv tak for hjælpen!
Avatar billede mik789 Nybegynder
21. november 2003 - 10:12 #12
avminarm> der var jo ingen der havde svaret... og der var gået temmelig lang tid.

Og ja, jeg har bevaret princippet i min løsning 11/11-2003 12:40:13. Jeg kan godt se din pointe i at løse problemer i db i stedet for i koden, men det er koden jeg skal rode mest med, derfor er det vigtigt at jeg ikke skal tænke på hvilke eventuelle 'hjælpefelter' jeg har lagt ind i tabellen, men at felterne giver sig selv nogen lunde intuitivt i forhold til opgaven...

jeg var ikke lige opmærksom på at det var så mange points jeg tog selv.... ;-\

vi kan dele, så jeg laver lige et spøgelsessp. til dig...
Avatar billede avminarm Juniormester
21. november 2003 - 10:16 #13
nej pyt med points, det var mere princippet i der blev lukket uden en kommentar!
Avatar billede mik789 Nybegynder
21. november 2003 - 10:21 #14
OK, men nu fik jeg oprettet et sp. til dig, så snup du bare de point ;-)
Avatar billede avminarm Juniormester
21. november 2003 - 10:36 #15
ok hvis du insisterer ;o) - ref: http://www.eksperten.dk/spm/430512
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