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
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);
$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:
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?
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.
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)