$_POST-Daten analysieren

Guten Tag alle zusammen,

ich bräuchte hier mal einen Denkansatz, da ich einfach nicht mehr weiter weiß. Ich plane gerade an einen Stat-Calculator. Hierbei gibt es 6 Input-Felder, die alle ausgefüllt werden können, aber nicht müssen. Nun wollte ich fragen, ob ich irgendwie herausfinden kann, welche Felder mit Inhalt ausgefüllt worden sind, um diese in die Funktion einsetzen zu können.

Hier soweit mein Script:

[code]
<input type=“text” name=“hp” […]> HP

<input type=“text” name=“atk” […]> Attack

<input type=“text” name=“def” […]> Defense

<input type=“text” name=“sp_atk” […]> Special Attack

<input type=“text” name=“sp_def” […]> Special Defense

<input type=“text” name=“spe” […]> Speed

<input type=“text” name=“rp” […]> Remaining Points

<?php $count = 0; $pHP = $_POST['hp']; $pATK = $_POST['atk']; $pDEF = $_POST['def']; $pSP_ATK = $_POST['sp_atk']; $pSP_DEF = $_POST['sp_def']; $pSPE = $_POST['spe']; if(!empty($pHP)) { $count++; $hp = 1; } if(!empty($pATK)) { $count++; $atk = 1; } if(!empty($pDEF)) { $count++; $def = 1; } if(!empty($pSP_ATK)) { $count++; $sp_atk = 1; } if(!empty($pSP_DEF)) { $count++; $sp_def = 1; } if(!empty($pSPE)) { $count++; $spe = 1; } /* echo $count."
"; */ //$X = 1 als Idee bzgl. Hilfsabfrage if($count == 0) { echo "Your team is still perfect."; } if($count == 1) { echo "You should give the ".$_POST['rp']." remaining points to his ".$pX." ."; } if($count == 2) { statcalc2(); } if($count == 3) { statcalc3(); } if($count == 4) { statcalc4(); } if($count == 5) { statcalc5(); } if($count == 6) { statcalc6(); } ?>[/code]

Der $count-Part funktioniert bereits, ich erhalte immer die Anzahl an abgeschickten Inhalten. Nur muss ich jetzt in die statcalcX-Funktion die Wert einsetzen und ich weiß ja nicht welche.
Beispiel: Attack und Special Attack werden ausgefüllt -> $count = 2 -> statcalc2($pATK, $pSP_ATK);

Ich bedanke mich schon jetzt für eure Hilfe. :'D

Gruß, DMan

$values = array_filter($_POST);[size=85] // Filtert alle leeren Einträge aus dem $_POST Array und speichert alles verbleibende in $values [/size]

$values beinhaltet nun nur noch die ausgefüllten Felder.

$anzahl = count($values)-1; [size=85]// Zählt die Anzahl an Einträgen im $values Array und zieht 1 von der Ergebnissumme ab und speichert die Anzahl in $anzahl.[/size]

Obiges entspricht der Anzahl der ausgefüllten Felder (dein $count++ kannst du dir damit sparen). Abzüglich 1, da der Calc-Button ebenfalls im Array enthalten ist, du könntest diesen aber auch mit array_pop($values) entfernen und erst anschließend zählen:

$values = array_filter($_POST);
array_pop($values);
$anzahl = count($values);

Nun hast du ein assoziatives Array namens values, das nur die ausgefüllten Felder enthält und das du an deine Funktion weitergeben kannst. Auch hast du das zählen vereinfacht.

Schon einmal Danke für die Hilfe. Nur frag ich mich, wie ich das jetzt in die Funktion eintragen soll.
statcalcX($values); ?

Und wie kann ich mir den Name vom dazugehörigen Wert ausgeben lassen?
print_r($values[‘name’]); hätte ich mir vorgestellt, gibt aber nicht das richtige Aus.

Du kannst eine generische Funktion statcalc() machen, der di die $values übergibst. Dort kannst du dann mit einer foreach-Schleife alle ausgefüllten Felder abarbeiten:

foreach($values as $key => $value)
{
echo 'Das Feld ‘.$key.’ hat folgenden Wert: '.$value;
}

Kannst du nicht auch für jede Eingabemöglichkeit einen voreingestellten Werte vorhalten?
Dann kannst du einfach prüfen, ob die Eingabe sinnvoll und vorhanden ist und ansonsten den
voreingestellten Wert verwenden.
Nach diese Sinn- und Existenzprüfung hast du zu allen Parametern einen Wert und brauchst
keine weitere Überlegung mehr, wenn das alles beireits bei der Prüfung der Eingabe erledigt ist.

[quote=“heavygale”]Du kannst eine generische Funktion statcalc() machen, der di die $values übergibst. Dort kannst du dann mit einer foreach-Schleife alle ausgefüllten Felder abarbeiten:[/quote]Ich verstehe nicht so ganz…

Was ich jetzt gemacht hätte: Alle values per foreach ausgeben (, + Zahl), dann alles ohne das erste Zeichen (,) in ne Datei schreiben, diese öffnen und per include in die Klammer laden.
Also: ,45 ,34, 53 -> 45, 34, 53 -> statcalc3(45, 34, 53);

Und das ist etwas umständlich…
Geht’s auch anders? Hab das bisher immer so oder so ähnlich gemacht.

[quote=“DManstrator”][quote=“heavygale”]Was ich jetzt gemacht hätte: Alle values per foreach ausgeben (, + Zahl), dann alles ohne das erste Zeichen (,) in ne Datei schreiben, diese öffnen und per include in die Klammer laden.
Also: ,45 ,34, 53 -> 45, 34, 53 -> statcalc3(45, 34, 53);[/quote][/quote]
Wie schön wenn PHP dafür den Python *-operator hätte:

mylist = [1, 2, 3] myfunc(*mylist) # wäre äquivalent zu: myfunc(1, 2, 3)
(obwohl ich bezweifle, ob es hier tatsächlich angebracht wäre)

Du könntest wie Hoffman vorgeschlagen hat, das Array mit defaultwerten füllen, und das Array dann einfach so an die Funktion übergeben. Ist es nicht möglich leere Stats einfach als 0 (Null) zu behandeln?

Nein, da in der Funktion ein Mittelwert gesucht wird und “0” das Ganze ordentlich nach unten ziehen würde.

Bei einer Mittelwertbildung bietet es sich ja an, in einer ersten Runde angeben zu lassen,
wieviele Werte eingegeben werden sollen und in der folgenden Runde dann entsprechend
viele Eingaben bereitzustellen.

Elegantere Alternative ist einfach eine etwa mit Semikolon zu separierende Listen eingeben zu
lassen, also nur ein Feld mit einer Liste als Eingabe, statt vieler Felder, kann man
dann leicht in ein Datenfeld bekannter Länge konvertieren.

Ansonsten ist natürlich immer zu prüfen, ob die eingegebenen Werte wirklich Zahlen sind.
Wenn nicht, muß man nochmal eingeben/korrigieren lassen…

[quote=“hoffmann”]Ansonsten ist natürlich immer zu prüfen, ob die eingegebenen Werte wirklich Zahlen sind.
Wenn nicht, muß man nochmal eingeben/korrigieren lassen…[/quote]
Formular nur bei aktiviertem JS, außerdem hab ich es so eingestellt, dass nur Zahlen eingegeben werden können.

Mal sehen, wenn ich’s mal so machen möchte, wie ich’s geplant habe, dann muss ichs wohl so machen.
Wäre u.a. mit einem Feld mit allen Daten einfacher als mehrere. Aber evtl. find ich ja noch ne Idee, z.B. wie bei einem Baumdiagramm, alle Möglichkeiten durchspielen.

Edit 21 Uhr:
Eine Idee wäre die Variablenvergabe in der foreach-Schleife.
Ist so gemeint, dass die Schleife durchläuft. $var1 = 1. Value, $var2 = 2. Value, etc.

und dann statcalcX($var1, $var2, …);

Aber wie kann ich das umsetzen? Hätte eine Idee:

$numb = 1; foreach($values as $key => $value) { $var.$numb = $value; $numb++; }

Dynamische Erzeugung von Variabelnamen ist in PHP möglich, ist aber auch generell kompletter Blödsinn, weswegen ich es nicht weiter erläutern werde.

Wie sehen denn deine statcalcX Funktionen überhaupt aus? Vielleicht solltest du an der Art und Weise, wie du das ganze berechnest, etwas ändern.

Na wenn das Formular ohne Interpretation von java-script gar nicht existiert (sieht in obigem Quelltext allerdings nach normalem (X)HTML aus, nicht nach einer Anmutung davon, welches mit einem Skript nur innerhalb eines DOMs erzeugt wurde, also kein wirklicher Inhalt ist), so ist es an sich ja auch belanglos, ob das Absenden des Formulars überhaupt einen Effekt hat, weil es dann ja kein Inhalt wäre. Zudem wäre es dann ja auch plausibel, die gesamte Rechnung per java-script zu machen und gar kein Formular zu verwenden. Mit solch einem Skript kann man doch immer genau prüfen, welche Werte vorliegen und kann im Bedarfsfalle innerhalb des DOMs sogar den Eindruck erwecken, daß bei Bedarf mehr Eingaben eingeblendet werden können. Auch kann man da die Rechnung bei jeder Änderung einer Eingabe durchführen lassen und sofort anzeigen lassen. PHP wäre dann ja relevant, weil es gar nicht um relevanten Inhalt geht, der berechnet und wieder ausgegeben werden müßte ;o)