webForumDet fria alternativet

Nästlade arrayer

9 svar · 358 visningar · startad av aasah

aasahMedlem sedan mars 20034 471 inlägg
#1

Hej!

Har nu börjat trixa med nästlade arrayer...

Har några radiofrågor q1, q2... på formen:

1)Fråga<BR>
<INPUT type="radio" name="q1" value="1">Alt 1.<BR>
<INPUT type="radio" name="q1" value="2">Alt 2.<BR>
<INPUT type="radio" name="q1" value="3">Alt 3.<BR>

Detta ligger i ett formulär och när det skickas har man - säger vi - valt Alt 1 på q1 och 2 på q2.

I php-filen har jag några kul arrayer:
$q1 = array("1" => 4, "2" => 5, "3" => 8);
$q2 = array("1" => 1, "2" => 7, "3" => 2);
$answers = array("q1" => $q1, "q2" => $q2);

Fråga 1: Blir inte $answers en 2-dimensionell array?

Fråga 2: Hur skriver jag för att i princip nå $answers["q1", "1"] (alltså värde 4)?

Fråga 3: Borde det inte gå att i $answers på något sätt ange index med det som $_POST returnerar? (Det är en POST.)
Alltså i princip $answers["q1", "$_POST["q1"]"] ger samma som i 2. Att det jag skriver nu inte funkar är föga förvånande eftersom jag nästlar " felaktigt. Men kan det överhuvudtaget göras på ett vettigare sätt?

Hoppas att ni begriper vad jag menar, fråga annars så ska jag försöka förtydliga mig.

MatteMedlem sedan aug. 20002 975 inlägg
#2
$answers['qi'][$_POST['q1']]

Borde funka.

aasahMedlem sedan mars 20034 471 inlägg
#3

Verkar inte som om det gör det... alternativt är det något jag inte ser som skiljer ditt och mitt åt.

I html

<html>
<head>
</head>

<body text="#000000" bgcolor="#90ee90" link="#0000ee" vlink="#551a8b"
 alink="#ff0000">

<form name="dum" action="arrs.php" method="POST">
1)Fråga<BR> 
<INPUT type="radio" name="q1" value="1">Alt 1.<BR> 
<INPUT type="radio" name="q1" value="2">Alt 2.<BR> 
<INPUT type="radio" name="q1" value="3">Alt 3.<BR>
2)Fråga<BR> 
<INPUT type="radio" name="q2" value="1">Alt 1.<BR> 
<INPUT type="radio" name="q2" value="2">Alt 2.<BR> 
<INPUT type="radio" name="q2" value="3">Alt 3.<BR>
<input type="submit">

</P>
</form>
</body>

I arrs.php

<?php

error_reporting(E_ALL); 

$q1 = array("1" => 4, "2" => 5, "3" => 8);
$q2 = array("1" => 1, "2" => 7, "3" => 2);
$answers = array("q1" => $q1, "q2" => $q2);
$antal = count($answers);

echo "$antal";

//main
//Koppla samman $answers med $q1 osv och vald siffra och skriv ut valet... 
for ($r = 1; $r <= $antal; $r++) {
   $qr = "q" . "$r";
   //om denna nedanstående rad avkommenteras blir det parse error. Annars blir det Warnings.
//echo "$qr besvarades med" . $_POST["$qr"] . " vilket ger $answers['$qr'][$_POST['$qr']]"; }
echo $answers['q1'][$_POST['q1']] . " ---------- " . $answers['q2'][$_POST['q2']];
?>
MatteMedlem sedan aug. 20002 975 inlägg
#4

Innanför apostrofer blir variabeln bokstavligt det du skriver, och inte det värde du lagrat i variabeln. Tag bort ett antal ' :

echo "$qr besvarades med" . $_POST[$qr] . " vilket ger ".$answers[$qr][$_POST[$qr]];
tydalMedlem sedan juni 20034 013 inlägg
#5

Aasah, vore jag du skulle jag hoppa indexnamnen i arrayerna eftersom de ändå består av ordningstal.

Alltså:

$q1 = array("", 4, 5, 8);
$q2 = array("", 1, 7, 2);

Går du med på att börja med 0 istället för 1 så kan du ta bort "" i början.

tydalMedlem sedan juni 20034 013 inlägg
#6

Sedan, ifall du vill ha godtyckligt antal frågor, passar det bättre med en foreach-loop:

// se till så ingen annan variabel börjar med q...
foreach ($_POST as $key => $value)
{
  if (substr($key, 0, 1) == "q")
  {
    $qnum = substr($key, 1);
    $answers[$qnum] = $q{$qnum}[$value];
  }
}
aasahMedlem sedan mars 20034 471 inlägg
#7

Matte skrev:

Innanför apostrofer blir variabeln bokstavligt det du skriver, och inte det värde du lagrat i variabeln. Tag bort ett antal ' :

echo "$qr besvarades med" . $_POST[$qr] . " vilket ger ".$answers[$qr][$_POST[$qr]];

TACK! Funkar klockrent! :)

tydal skrev:

Sedan, ifall du vill ha godtyckligt antal frågor, passar det bättre med en foreach-loop:

// se till så ingen annan variabel börjar med q...
foreach ($_POST as $key => $value)
{
  if (substr($key, 0, 1) == "q")
  {
    $qnum = substr($key, 1);
    $answers[$qnum] = $q{$qnum}[$value];
  }
}

Nu är klockan mycket igen, så det är säkert jag som är trött och okunnig... Men blir det verkligen en nästlad array av detta? Om vi tex betraktar fråga q10, blir det inte:
$qnum = 10;
$answers[10]=$q10[1/*tex*/];
Dvs $answers verkar få ETT värde i pos 10 i stället för en array med värden? Var tänker jag fel? :q

tydalMedlem sedan juni 20034 013 inlägg
#8

Aasah, du tänker inte fel här, det är alldeles rätt att $answers inte blir en nästlad array. I ditt fall behöver du inte vad jag kan se en nästlad array eftersom du kallar dina index för q1, q2, q3 osv... Hade de istället hetat "ölburkar", "svanar", "kakmonster", då hade det varit idé att göra som du gjort, men när de ändå heter 1, 2, 3 så behöver man ju inte krångla till det utan kan utnyttja arrayens egen numreringsfunktion.

q10 lagras alltså i $answers[10], q9 i $answers[9] osv...

aasahMedlem sedan mars 20034 471 inlägg
#9

tydal skrev:

... I ditt fall behöver du inte vad jag kan se en nästlad array eftersom du kallar dina index för q1, q2, q3 osv...
q10 lagras alltså i $answers[10], q9 i $answers[9] osv...

Jo, för det är inte svaret på fråga i som ska in i $answers på position i. $answers rymmer alla svar man överhuvudtaget kan få på den frågan.

Exempel: På fråga 1 gäller: alt 1 är värt 4 poäng, alt 2 är värt 6 poäng och alt 3 är värt 1 poäng. Då håller jag rätt på den infon i $q1 = array(1 => 4, 2=> 6, 3 => 1). Sedan har jag ett antal andra frågor och då vill jag stoppa in alla möjliga resultat i $answers = array ("q1" => $q1, ...). När sedan valet gjorts så kanske det blev alt 1 på fråga 1. Då vill jag kunna hitta 4:an genom att gå in på $answers[1][1].

Skälet till att jag slänger in alla "$qi" i en $answers i stället för att bara jämföra dem en och en är att det var den bästa skalbara lösning jag kom på. Då behöver jag ju inte hålla reda på hur många frågorna är, de är helt enkelt lika många som det finns poster i $answers. Men det kanske finns bättre sätt?

tydalMedlem sedan juni 20034 013 inlägg
#10

Aha, då hänger jag med på vad du menar. Jag gick nog ett steg för långt :-)

Min lösning resulterar nämligen i att $answers fylls med de värden som gäller utefter det som besökaren har svarat. Dvs, om besökaren har varlt alternativ 2 på fråga 1 så kommer $answers[1] att innehålla 6. För jag trodde det var det du ville ha fram?

I och med att du redan har lagrat alla värden i $q-arrayer så blir det ju inte särskilt skalbart om du dessutom ska lägga dem i en ytterligare array ($answers), för då tar det ju upp dubbelt så mycket minne.

Genom att använda foreach behöver du heller inte hålla reda på hur många frågorna är, utan de är helt enkelt lika många som besökaren har svarat på.

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)