Dynamisches assoziatives array
Hallo alle miteiander,
ich habe einen dynamischen assoc array.
$wert = eine Leistung
$preis = der Preis
über mehrere Formulare habe ich es nun endlich so hinbekommen, dass ich mit array_combine diese beiden arrays in einen assoziativen zusammengeführt habe.
ein Feld ist noch offen, nämlich die Anzahl der Leistungen.
Ich erstelle ein Rechenprogramm.
So nun habe ich folgende Daten
$wert => $preis mit $anzahl (nicht im array) etc.
Da man immer mehrere $werte auswählen kann, weiß ich im vorhinein nicht wie groß der Array wird.
Ich muss nun aber den Preis mit der eingegebenen Anzahl muliplizieren.
Wie mache ich das mit einem assoz. array?
Ich glaube ich habe nur ein verständnis problem oder mir fehlt eine array funktion.
Soll ich zuerst den Array in einzelne Variablen zerlegen?
Aber da er dynamisch ist, halte ich das nicht für eine gute Idee.
Bitte um Hilfe sollte am 4.1 fertig sein.
Danke
ich habe einen dynamischen assoc array.
$wert = eine Leistung
$preis = der Preis
über mehrere Formulare habe ich es nun endlich so hinbekommen, dass ich mit array_combine diese beiden arrays in einen assoziativen zusammengeführt habe.
ein Feld ist noch offen, nämlich die Anzahl der Leistungen.
Ich erstelle ein Rechenprogramm.
So nun habe ich folgende Daten
$wert => $preis mit $anzahl (nicht im array) etc.
Da man immer mehrere $werte auswählen kann, weiß ich im vorhinein nicht wie groß der Array wird.
Ich muss nun aber den Preis mit der eingegebenen Anzahl muliplizieren.
Wie mache ich das mit einem assoz. array?
Ich glaube ich habe nur ein verständnis problem oder mir fehlt eine array funktion.
Soll ich zuerst den Array in einzelne Variablen zerlegen?
Aber da er dynamisch ist, halte ich das nicht für eine gute Idee.
Bitte um Hilfe sollte am 4.1 fertig sein.
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 132576
Url: https://administrator.de/contentid/132576
Ausgedruckt am: 20.11.2024 um 13:11 Uhr
12 Kommentare
Neuester Kommentar
also - irgendwie verstehe ich die frage ehrlich gesagt nicht...
Ich würde es ggf. auch so lösen:
$variable["wert"]
$variable["preis"]
$variable["anzahl"]
schon brauche ich mich nur mit diesem array rumschlagen - und kann im folgenden einfach z.B. für den Gesamtpreis den Array einmal durchaddieren (immer $var["wert"]=$var["preis"]*$var["anzahl"] und die 0 halt hochzählen lassen).
hängt aber davon ab was du genau programmieren möchtest ob sich so eine Lösung eignet oder nicht (z.B. wenn du verschiedene Steuersätze drin hast dann kann das damit etwas komplex werden -> da du ja ggf. ausgeben musst wie hoch die Summe mit 0, mit 7 und mit 19% MwSt ist)
Ich würde es ggf. auch so lösen:
$variable["wert"]
$variable["preis"]
$variable["anzahl"]
schon brauche ich mich nur mit diesem array rumschlagen - und kann im folgenden einfach z.B. für den Gesamtpreis den Array einmal durchaddieren (immer $var["wert"]=$var["preis"]*$var["anzahl"] und die 0 halt hochzählen lassen).
hängt aber davon ab was du genau programmieren möchtest ob sich so eine Lösung eignet oder nicht (z.B. wenn du verschiedene Steuersätze drin hast dann kann das damit etwas komplex werden -> da du ja ggf. ausgeben musst wie hoch die Summe mit 0, mit 7 und mit 19% MwSt ist)
Mir ist die Frage auch noch rätselhaft. Wozu wird array_combine benutzt? Eigentlich sollte doch eher ein indiziertes Array entstehen, dessen Elemente dann wiederum homogen aus einem assoziativem Array oder Objekt bestehen könnten.
Ich würde allerdings mehrere Rechnungsposten in einem Schritt erfassen. Dazu arbeite ich mit 3 einzelnen indizierten Arrays, die mir über $_POST direkt übergeben werden:
Du kannst nun mittels DHMTL das Formular clientseitig direkt erweitern für weitere Posteneingaben oder Du führst mehrere Eingabeseiten per PHP in einer Session zusammen. Ich würde beides machen, die bequeme Methode und eine Ausweichmöglichkeit in PHP, falls JavaScript deaktiviert ist oder die Eingaben nochmal bearbeitet/erweitert werden sollen.
array
(
0 => array(leistung => 'Leistung 1', 'wert' => 1.95, 'anzahl' => 3),
1 => array(leistung => 'Leistung 2', 'wert' => 2.95, 'anzahl' => 10),
2 => array(leistung => 'Leistung 3', 'wert' => 3.95, 'anzahl' => 50),
)
Ich würde allerdings mehrere Rechnungsposten in einem Schritt erfassen. Dazu arbeite ich mit 3 einzelnen indizierten Arrays, die mir über $_POST direkt übergeben werden:
<form method="post">
Leistung: <input type="text" name="leistung" />
Wert: <input type="text" name="wert" />
Anzahl: <input type="text" name="anzahl" />
<br />
Leistung: <input type="text" name="leistung" />
Wert: <input type="text" name="wert" />
Anzahl: <input type="text" name="anzahl" />
<br />
Leistung: <input type="text" name="leistung" />
Wert: <input type="text" name="wert" />
Anzahl: <input type="text" name="anzahl" />
<br />
<input type="submit" value="abschicken"/>
</form>
<?php
echo '<pre>';
print_r ($_POST);
echo '</pre> Anzahl Leistungen: ' . count($assoc);
$anz_gesamt = $betrag_gesamt = 0;
echo '<table border="1">'
. '<tr> <th>Posten</th><th>Leistung</th> <th>Wert</th> <th>Anzahl</th> <th>Betrag</th>';
for ($i = 0; $i < count($_POST[leistung]); $i++)
{
$betrag = $_POST['wert'][$i] * $_POST['anzahl'][$i];
echo '<tr>'
. "<td>$i</td>"
. "<td>{$_POST[leistung][$i]}</td>"
. "<td>{$_POST[wert][$i]}</td>"
. "<td>{$_POST[anzahl][$i]}</td>"
. "<td>$betrag</td>"
. "</tr>\n";
;
$anz_gesamt += $_POST['anzahl'][$i];
$betrag_gesamt += $betrag;
}
echo "<tr> <td>Summe</td> <td> </td> <td> </td> <td>$anz_gesamt</td> <td>$betrag_gesamt</td>"
. '</table>';
?>
Du kannst nun mittels DHMTL das Formular clientseitig direkt erweitern für weitere Posteneingaben oder Du führst mehrere Eingabeseiten per PHP in einer Session zusammen. Ich würde beides machen, die bequeme Methode und eine Ausweichmöglichkeit in PHP, falls JavaScript deaktiviert ist oder die Eingaben nochmal bearbeitet/erweitert werden sollen.
Ok, während der letzten Eingabe hattest Du nochmals gepostet...
Nun wirds schon etwas klarer, wenn vielleicht auch nicht viel. Du willst also Datenbankabfragen verarbeiten? Bei Datenbanken solltest Du Stamm- und Bewegungsdaten erfassen. Stammdaten hast Du ja schon erfaßt. Das sind Daten wie Kundeninformationen, Angebotspalette usw. Dann stellst Du z.B. ein Bestell-Formular dar, in welchem man Artikel aus dem bestehenden Sortiment auswählen kann. Die Bezeichnung ist die Beschriftung der Auswahlmöglichkeiten (z.B. SELECT/OPION-Elemente), das value-Attribut, das per Formular absenden übermittelt wird, trägt die Artikel ID. Die legst Du direkt in eine Datenbank-Tabelle "Bestellungen" ab. Dies sind die sogenannten Bewegungsdaten. Mehrere Posten faßt man mit einer Bestell-ID zusammen. Darin enthalten sind im Prinzip nur Artikel-ID, Menge, Rabatt und ähnliches, ggf. auch der Preis, um individuelle Angebote an einen Kunden zu erfassen oder für den Fall von Preisänderungen, sodaß die Bestellung den Preis zu den alten Konditionen beibehält.
Am Ende kannst Du die Bestellung mit den Stammdaten in einer einzigen Abfrage verknüpfen und die berechneten Felder SQL überlassen. Die Gesamtsumme der Rechnung kannst Du in der Schleife zusammenrechnen oder noch eine Aggregat-SQL-Abfrage durchführen.
Wenn Du dein Array in einer Schleife durchgehst, kannst Du je eine INSERT-Anweisung absetzen, oder Du setzt einen String zusammen, der in einer einzigen Anweisung alle Werte einträgt.
INSERT INTO `tabellenname` VALUES (wert_feld1, wert_feld2), (wert_feld1, wert_feld2), ... ;
Gesamtsummen bilden kannst Du z.B. mit
SELECT sum(`anzahl`), sum(`betrag`) FROM `tabellenname`;
Auch die Anzahl der Datensätze kannst Du, falls benötigt, mit in der Abfrage ermitteln:
SELECT count(`id`), sum(`anzahl`), sum(`betrag`) FROM `tabellenname`;
Ansonsten könntest Du ja mal Dein gesamtes Projekt auf dem Stand, wie es momentan ist, irgendwo quelloffen hinterlegen - und eine genaue Beschreibung, was es leisten soll. Dann läßt sich bestimmt mehr sagen.
Nun wirds schon etwas klarer, wenn vielleicht auch nicht viel. Du willst also Datenbankabfragen verarbeiten? Bei Datenbanken solltest Du Stamm- und Bewegungsdaten erfassen. Stammdaten hast Du ja schon erfaßt. Das sind Daten wie Kundeninformationen, Angebotspalette usw. Dann stellst Du z.B. ein Bestell-Formular dar, in welchem man Artikel aus dem bestehenden Sortiment auswählen kann. Die Bezeichnung ist die Beschriftung der Auswahlmöglichkeiten (z.B. SELECT/OPION-Elemente), das value-Attribut, das per Formular absenden übermittelt wird, trägt die Artikel ID. Die legst Du direkt in eine Datenbank-Tabelle "Bestellungen" ab. Dies sind die sogenannten Bewegungsdaten. Mehrere Posten faßt man mit einer Bestell-ID zusammen. Darin enthalten sind im Prinzip nur Artikel-ID, Menge, Rabatt und ähnliches, ggf. auch der Preis, um individuelle Angebote an einen Kunden zu erfassen oder für den Fall von Preisänderungen, sodaß die Bestellung den Preis zu den alten Konditionen beibehält.
Am Ende kannst Du die Bestellung mit den Stammdaten in einer einzigen Abfrage verknüpfen und die berechneten Felder SQL überlassen. Die Gesamtsumme der Rechnung kannst Du in der Schleife zusammenrechnen oder noch eine Aggregat-SQL-Abfrage durchführen.
Wenn Du dein Array in einer Schleife durchgehst, kannst Du je eine INSERT-Anweisung absetzen, oder Du setzt einen String zusammen, der in einer einzigen Anweisung alle Werte einträgt.
INSERT INTO `tabellenname` VALUES (wert_feld1, wert_feld2), (wert_feld1, wert_feld2), ... ;
Gesamtsummen bilden kannst Du z.B. mit
SELECT sum(`anzahl`), sum(`betrag`) FROM `tabellenname`;
Auch die Anzahl der Datensätze kannst Du, falls benötigt, mit in der Abfrage ermitteln:
SELECT count(`id`), sum(`anzahl`), sum(`betrag`) FROM `tabellenname`;
Ansonsten könntest Du ja mal Dein gesamtes Projekt auf dem Stand, wie es momentan ist, irgendwo quelloffen hinterlegen - und eine genaue Beschreibung, was es leisten soll. Dann läßt sich bestimmt mehr sagen.
Das wäre in meinem Beispiel oben (wo ich in einer Schleife die Eingabedaten plump in einer HTML-Tabelle ausgebe) in den Zeilen
22: $anz_gesamt = $betrag_gesamt = 0;
...
29: $betrag = $_POST['wert'][$i] * $_POST['anzahl'][$i];
...
38: $anz_gesamt += $_POST['anzahl'][$i];
39: $betrag_gesamt += $betrag;
Am besten das gesamte Beispiel mal in einen HTML-body kopieren, testen und nachvollziehen. Dann müstest Du das auf Dein Projekt eigentlich anwenden können.
Hier mal noch ein paar Dokus:
http://de3.php.net/manual/de/book.array.php
http://dev.mysql.com/doc/refman/5.1/de/insert.html
Und falls Du doch über mehrere Seiten hinweg Daten sammeln möchtest:
http://de3.php.net/manual/de/book.session.php
Dann kannst Du alles in einem Session-Array speichern und den Benutzer nur mit einer Session-ID tracken, ohne die bereits erfaßten Daten dauernd hin und her senden zu müssen.
EDIT:
Und der Fehlerteufel hatte zugeschlagen, in Zeile 22 muß es natürlich $betrag_gesamt statt $wert_gesamt heißen; hatte die Variablen nicht vollständig umbennt. Habs nun korrigiert.
Nicht zu danken ;)
Und noch das mit dem SQL, das Du in der selben schleife zusammenbauen kannst... hier nochmal isoliert:
Erläuterung:
$values =
hängt ans Array an
"('{$_POST[leistung][$i]}', '{$_POST[wert][$i]}', '{$_POST[anzahl][$i]}')";
Hier wird in (doppelten) Anführungszeichen interpoliert. (Einfache) Apostroph sind Bestandteil vom SQL-Code. Damit PHP weiß, was zur Variablen (Array) gehört, können geschweifte Klammern {} gesetzt werden.
vereinfachtes Beispiel, wo keine {} benötigt werden:
"('$var1', '$var2', 'var3')"
implode setzt die Elemente dann zu einem String zusammen, getrennt durch die Zeichenkette ", " - also Komma+Leerzeichen.
Und noch das mit dem SQL, das Du in der selben schleife zusammenbauen kannst... hier nochmal isoliert:
$values = array();
for ($i = 0; $i < count($_POST[leistung]); $i++)
{
$values = "('{$_POST[leistung][$i]}', '{$_POST[wert][$i]}', '{$_POST[anzahl][$i]}')";
}
echo 'INSERT INTO `tabelle` VALUES ' . implode(', ', $values);
Erläuterung:
$values =
hängt ans Array an
"('{$_POST[leistung][$i]}', '{$_POST[wert][$i]}', '{$_POST[anzahl][$i]}')";
Hier wird in (doppelten) Anführungszeichen interpoliert. (Einfache) Apostroph sind Bestandteil vom SQL-Code. Damit PHP weiß, was zur Variablen (Array) gehört, können geschweifte Klammern {} gesetzt werden.
vereinfachtes Beispiel, wo keine {} benötigt werden:
"('$var1', '$var2', 'var3')"
implode setzt die Elemente dann zu einem String zusammen, getrennt durch die Zeichenkette ", " - also Komma+Leerzeichen.