[PHP] 4-dimensionaal array? Of toch een andere manier?

Pagina: 1
Acties:
  • 388 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 09:45
Beste mensen,

Ik zit met het volgende probleem. Op een pagina staat een overzicht met vragen en antwoorden, dat ziet er als volgt uit.
  • Vraag 1
    • Antwoord 1
    • Antwoord 2
    • Antwoord 3
    • Antwoord 4
    • Antwoord 5
  • Vraag 2
    • Antwoord 1
    • Antwoord 2
  • Vraag 3
    • Antwoord 1
    • Antwoord 2
    • Antwoord 3
De data voor de vragen en antwoorden worden opgehaald uit een database, echter behalve alleen de text voor de vragen en antwoorden, moeten ook de id's en volgorde mee genomen worden.

In mijn eerste opzet zou dat er als volgt uit komen te zien:
$antwoorden[0][0] = antwoord_id
$antwoorden[0][1] = antwoord text
$antwoorden[1][0] = antwoord_id
$antwoorden[1][1] = antwoord text
$antwoorden[2][0] = antwoord_id
$antwoorden[2][1] = antwoord text

$antwoorden zou dan telkens gemaakt worden voor elke vraag

$vragen[0][0] = vraag_id
$vragen[0][1] = vraag_stelling
$vragen[0][2] = $antwoorden
$vragen[1][0] = vraag_id
$vragen[1][1] = vraag_stelling
$vragen[1][2] = $antwoorden

$vragen zou vervolgens aan Smarty doorgegeven worden om uit te lezen. Om een antwoord tekst af te drukken zou dan $vragen[0][2][1][1] nodig zijn.

Op zich is dat allemaal wel redelijk te doen, maar je moet er bij het vullen van het array goed op letten of je een nieuwe vraag hebt of een nieuw antwoord. Bij een nieuw antwoord ga je verder met $antwoorden vullen, bij een nieuwe vraag hang je $antwoorden aan de vorige vraag en maak je $antwoorden weer leeg.

Dit uitlezen is ook wel te doen, maar ook daar moeten weer allerlei checks gedaan worden.

Nu is mijn vraag of dit eigenlijk wel de juiste manier is om dit te doen of dat er een andere, eenvoudigere en minder omslachtige, oplossing is. Zou dus graag jullie mening / opmerkingen / adviezen willen horen.

Acties:
  • 0 Henk 'm!

  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-08 17:53

Yoozer

minimoog

Aanbevolen leesvoer: N:M relaties, normaliseren, opsplitsen :) Eventueel ook kijken naar "jagged arrays".

Ter verduidelijking:
1 vraag kan N (1 of meer) antwoorden hebben. Goed, da's duidelijk: je maakt een tabel vragen en een tabel antwoorden. Als 1 antwoord altijd maar bij 1 vraag hoort is het makkelijk: in de tabel antwoorden maak je een kolom waar in staat bij welke vraag-ID het antwoord hoort. Volgorde kun je ook toevoegen als een extra kolom, tot zover geen probleem. Weergeven is ook niet zo'n issue: als je een tabel als resultaat hebt die

vraag 1antwoord 1
vraag 1antwoord 2
vraag 1antwoord 3
vraag 2antwoord 1
vraag 2antwoord 2


er zo uitziet is dat ook nog wel af te vangen.

Of is 't dat niet?

[ Voor 111% gewijzigd door Yoozer op 18-09-2007 13:23 ]

teveel zooi, te weinig tijd


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Om het voor jezelf overzichtelijk te houden kan je de informatie die je uit de database hebt gehaald het beste in objecten stoppen. Je hebt dan een object Vraag met velden id, text en antwoorden, waarbij antwoorden een array van Antwoord objecten is, met ieder een antwoord.id en een antwoord.text. Vragen[3].antwoorden[0].text ga je bij het vullen een stuk beter snappen dan vragen[3][2][0][1] voor het de tekst van het eerste antwoord bij de derde vraag.

[ Voor 3% gewijzigd door Confusion op 18-09-2007 13:33 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 09:45
Nee, helaas niet, dat is namelijk al opgelost op de manier zoals jij het omschrijft.
Het gaat mij er echt om hoe ik de data om kan zetten in iets wat ik in 1 variabele door kan geven aan Smarty.
Confusion schreef op dinsdag 18 september 2007 @ 13:32:
Om het voor jezelf overzichtelijk te houden kan je de informatie die je uit de database hebt gehaald het beste in objecten stoppen. Je hebt dan een object Vraag met velden id, text en antwoorden, waarbij antwoorden een array van Antwoord objecten is, met ieder een antwoord.id en een antwoord.text. Vragen[3].antwoorden[0].text ga je bij het vullen een stuk beter snappen dan vragen[3][2][0][1] voor het de tekst van het eerste antwoord bij de derde vraag.
Dat is inderdaad geen slecht idee, zal overzichtelijker worden dan dat het nu is. Zo te zien stop je uiteindelijk ook weer alle objecten van het type Vraag in een array. Zal er eens wat mee spelen, om te kijken of het lukt waar ik heen wil uiteindelijk.

Acties:
  • 0 Henk 'm!

Verwijderd

je kan toch gewoon:

array[0][id] => id van de vraag
array[0][vraag] => is de vraagstelling van de eerste vraag in de array
array[0][antwoord][0][id] => antwoord_id
array[0][antwoord[0][antwoord] => antwoord op de vraag

Lijkt me ook vrij duidelijk, dit kan je zeer eenvoudig met een dubbele foreach doorlopen in PHP... (heb geen ervaring met smarty dus weet niet precies hoe dat daar precies gaat)

btw... je kan ook zeer eenvoudig de key (indien uniek (mag ik hopen)) gebruiken als key voor je array, dus:

array[id][vraag][antwoord_id][antwoord]

ben je gelijk klaar volgens mij,... dit kan je weer mooi doen met foreach($array as $key => $item)

[ Voor 24% gewijzigd door Verwijderd op 18-09-2007 23:10 ]


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op dinsdag 18 september 2007 @ 23:07:
je kan toch gewoon:

array[0][id] => id van de vraag
array[0][vraag] => is de vraagstelling van de eerste vraag in de array
array[0][antwoord][0][id] => antwoord_id
array[0][antwoord[0][antwoord] => antwoord op de vraag

Lijkt me ook vrij duidelijk, dit kan je zeer eenvoudig met een dubbele foreach doorlopen in PHP... (heb geen ervaring met smarty dus weet niet precies hoe dat daar precies gaat)

btw... je kan ook zeer eenvoudig de key (indien uniek (mag ik hopen)) gebruiken als key voor je array, dus:

array[id][vraag][antwoord_id][antwoord]

ben je gelijk klaar volgens mij,... dit kan je weer mooi doen met foreach($array as $key => $item)
Kan kan, maar een OO opzet waar Confusion het al over had is een stuk overzichtelijker, anders krijg je allemaal spagetti-code, wel iets meer werk, initieel alleen waarschijnlijk. Voordeel is dat je al je business in een klasse stopt, dan krijg je b.v. bij de klasse Question: addAnswer(Answer a) , getAnswers() etc.

Verwijderd

@Y0ur1... ik zeg toch ook niet dat een OO aanpak slechter is, ik geef slechts een andere kijk op de multidimensionale array! Ik zal de laatste zijn die dat zal beweren, want confusion geeft denk ik de beste oplossing voor het probleem.

  • -=bas=-
  • Registratie: Oktober 2000
  • Laatst online: 22-04 02:56
Je kan ook weer arrays in arrays stoppen zodat je iets krijgt van :

$object[0]['vraag'] = array('vraagid' => 0,'vraagcontent' => 'dit is de vraag');
$object[0]['antwoorden'] = array(array('antwoordid' => 1,'antwoordcontent' => 'ja'),array('antwoordid' => 2,'antwoordcontent' => 'nee'));

Met count, isset, etc loop je dit soort zaken eenvoudig af en het is wat leesbaarder dan $object[0][1][4][1]. :)

Senile! Senile Oekaki


  • -=bas=-
  • Registratie: Oktober 2000
  • Laatst online: 22-04 02:56
Kan kan, maar een OO opzet waar Confusion het al over had is een stuk overzichtelijker, anders krijg je allemaal spagetti-code,
Spagetti code heeft hier niet zo van belang.
Het gaat om leesbaarheid van de code.
OO is leuk maar is zeker niet altijd iets wat aan te bevelen is.
Zeker met een taal zoals PHP is de gouden middenweg de beste oplossing.

Senile! Senile Oekaki

Pagina: 1