bujutsu
Goto Top

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

Content-ID: 132576

Url: https://administrator.de/contentid/132576

Ausgedruckt am: 20.11.2024 um 13:11 Uhr

maretz
maretz 01.01.2010 um 14:47:40 Uhr
Goto Top
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)
dog
dog 01.01.2010 um 14:50:28 Uhr
Goto Top
Ich glaube der TO kennt noch nicht das Konzept von Schleifen.

Auch wenn ich die Frage nicht wirklich verstanden habe:
$total = 0;
foreach($arr as $wert => $preis) {
 $total += $preis * $anzahl;
}

Grüße

Max
bujutsu
bujutsu 01.01.2010 um 15:15:37 Uhr
Goto Top
vielen Dank max für die Hilfe werde das mal probieren.
bujutsu
bujutsu 01.01.2010 um 15:44:06 Uhr
Goto Top
So nun hat das mal supertoll gefunkt:
anbei der Code:
foreach ($wahl as $wert=>$anzahl) {
$preis = "SELECT Preis FROM offers WHERE angebot_bez='". $wert . "' AND kategorien_id=(SELECT kategorien_id FROM categories WHERE kategorien_bezeichnung='" . $leger_result[kategorien_bezeichnung] . "'AND active=1) ";
$preis_query = mysql_query($preis);
$preis_result = mysql_fetch_array($preis_query);
$gesamt = $anzahl * $preis_result[Preis];


echo $wert . " " . $anzahl . " " . $preis_result[Preis] . "€ Gesamtwert: " . $gesamt . "€<br>" ;
}

So ich bekomme nun alles was ich brauche.
Zwei Sachen fehlen aber noch und da habe ich keinen Plan.

Wie ihr sehen könnt rechne ich $anzahl mit $preis_result[Preis] zusammen um auf $gesamt zu kommen.
Schön und das in einer Schleife.
Nun muss ich aber diese gesamten auch nochmal zusammenrechnen, denn ich brauch ja eine Gesamtsumme aller $gesamt.
Wie soll denn das nun gehen.
Und zu guter letzt:
Wie schreibe ich nun jede einzelne Zeile = $wert, §anzahl aus diesem Array als separate Zeile in einen MYSQL DB???
Das habe ich noch nirgends gefunden. Einen assoziativen Array in separaten Zeilen in eine DB schreiben.

pleeeeaaaasssseeeeee das wäre toll
QuasimodosKlon
QuasimodosKlon 01.01.2010 um 15:46:49 Uhr
Goto Top
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.

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>&nbsp;</td> <td>&nbsp;</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.
bujutsu
bujutsu 01.01.2010 um 15:59:46 Uhr
Goto Top
Danke so wie du meinst muss ich ein indiziertes array über mehrere formularseiten entstehen lassen?
Da habe ich leider keine Ahnung wie das gehen soll.
seite1:
Auswahl der Leistung = $leistung (das kann nämlich schon ein array sein, da man mehrere Leistungen aussuchen kann)
seite 2:
auswahl der anzahl = $anzahl
und daraus habe ich mit combine einen array $leistung=>$anzahl gemacht zu dem ich nun den Preis gesucht habe.

Steh am Schlauch, wie Du das meinst. Dein Code ist ja das Endprodukt, aber wie komme ich dorthin?
bujutsu
bujutsu 01.01.2010 um 16:04:48 Uhr
Goto Top
ach ja und bitte wie schreibe ich dann jede einzelne array zeile einzeln in die datenbank?
das raff ich überhaupt nicht.
QuasimodosKlon
QuasimodosKlon 01.01.2010 um 16:34:06 Uhr
Goto Top
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.
bujutsu
bujutsu 01.01.2010 um 16:44:04 Uhr
Goto Top
Quasimodosklon mein Held!!
Vielen Dank für Deine prof. Hilfe.
Kenn mich nun aus was Du meinst.
eine Sache noch.
Kannst Du mir die Schleife zeigen in der ich die Gesamtsumme ausrechne?
Das ist mir noch nicht klar.

Das mit der SQL Anweisung kann ich ja erst machen, wenn schon alle datensätze in der DB stehen. Ergo erst am Ende des Skripts. Dann kann ich diese aber nicht schon auf der letzten Seite der Rechnung ausgeben! BEVOR ich dann alles mit einer Schleife und INSERT (!! face-wink) in die DB schreibe. Also brauche ich diese Zusammenrechnungsschleife.
Danke Dir.
QuasimodosKlon
QuasimodosKlon 01.01.2010 um 17:19:44 Uhr
Goto Top
Zitat von @bujutsu:
Kannst Du mir die Schleife zeigen in der ich die Gesamtsumme ausrechne?

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.
bujutsu
bujutsu 01.01.2010 um 17:45:55 Uhr
Goto Top
na dann mach ich mich mal ran. Vielen Dank nochmals
QuasimodosKlon
QuasimodosKlon 01.01.2010 um 18:03:12 Uhr
Goto Top
Nicht zu danken ;)

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.