11. november 2003 - 09:50Der 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:
Der bliver investeret massivt i AI. Teknologien er mere tilgængelig end nogensinde, og ambitionerne er høje. Alligevel oplever mange virksomheder, at resultaterne udebliver.
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???)
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
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....
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.
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...
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.