Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dynamisches assoziatives array

Frage Entwicklung PHP

Mitglied: bujutsu

bujutsu (Level 1) - Jetzt verbinden

01.01.2010, aktualisiert 20:36 Uhr, 7732 Aufrufe, 12 Kommentare

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
Mitglied: maretz
01.01.2010 um 14:47 Uhr
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"][0]=$var["preis"][0]*$var["anzahl"][0] 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)
Bitte warten ..
Mitglied: dog
01.01.2010 um 14:50 Uhr
Ich glaube der TO kennt noch nicht das Konzept von Schleifen.

Auch wenn ich die Frage nicht wirklich verstanden habe:
01.
$total = 0; 
02.
foreach($arr as $wert => $preis) { 
03.
 $total += $preis * $anzahl
04.
}
Grüße

Max
Bitte warten ..
Mitglied: bujutsu
01.01.2010 um 15:15 Uhr
vielen Dank max für die Hilfe werde das mal probieren.
Bitte warten ..
Mitglied: bujutsu
01.01.2010 um 15:44 Uhr
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
Bitte warten ..
Mitglied: QuasimodosKlon
01.01.2010 um 15:46 Uhr
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.

01.
array 
02.
03.
  0 => array(leistung => 'Leistung 1', 'wert' => 1.95, 'anzahl' => 3), 
04.
  1 => array(leistung => 'Leistung 2', 'wert' => 2.95, 'anzahl' => 10), 
05.
  2 => array(leistung => 'Leistung 3', 'wert' => 3.95, 'anzahl' => 50), 
06.
)
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:
01.
<form method="post"
02.
  Leistung: <input type="text" name="leistung[]" /> 
03.
  Wert: <input type="text" name="wert[]" /> 
04.
  Anzahl: <input type="text" name="anzahl[]" /> 
05.
  <br /> 
06.
  Leistung: <input type="text" name="leistung[]" /> 
07.
  Wert: <input type="text" name="wert[]" /> 
08.
  Anzahl: <input type="text" name="anzahl[]" /> 
09.
  <br /> 
10.
  Leistung: <input type="text" name="leistung[]" /> 
11.
  Wert: <input type="text" name="wert[]" /> 
12.
  Anzahl: <input type="text" name="anzahl[]" /> 
13.
  <br /> 
14.
  <input type="submit" value="abschicken"/> 
15.
</form> 
16.
<?php 
17.
 
18.
echo '<pre>'
19.
print_r ($_POST); 
20.
echo '</pre> Anzahl Leistungen: ' . count($assoc); 
21.
 
22.
$anz_gesamt = $betrag_gesamt = 0; 
23.
 
24.
echo '<table border="1">' 
25.
   . '<tr> <th>Posten</th><th>Leistung</th> <th>Wert</th> <th>Anzahl</th> <th>Betrag</th>'
26.
 
27.
for ($i = 0; $i < count($_POST[leistung]); $i++) 
28.
29.
  $betrag = $_POST['wert'][$i] * $_POST['anzahl'][$i]; 
30.
  echo '<tr>' 
31.
     . "<td>$i</td>" 
32.
     . "<td>{$_POST[leistung][$i]}</td>" 
33.
     . "<td>{$_POST[wert][$i]}</td>" 
34.
     . "<td>{$_POST[anzahl][$i]}</td>" 
35.
     . "<td>$betrag</td>" 
36.
     . "</tr>\n"
37.
38.
  $anz_gesamt  += $_POST['anzahl'][$i]; 
39.
  $betrag_gesamt += $betrag
40.
41.
 
42.
echo "<tr> <td>Summe</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>$anz_gesamt</td> <td>$betrag_gesamt</td>" 
43.
   . '</table>'
44.
?>
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.
Bitte warten ..
Mitglied: bujutsu
01.01.2010 um 15:59 Uhr
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?
Bitte warten ..
Mitglied: bujutsu
01.01.2010 um 16:04 Uhr
ach ja und bitte wie schreibe ich dann jede einzelne array zeile einzeln in die datenbank?
das raff ich überhaupt nicht.
Bitte warten ..
Mitglied: QuasimodosKlon
01.01.2010 um 16:34 Uhr
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.
Bitte warten ..
Mitglied: bujutsu
01.01.2010 um 16:44 Uhr
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 (!! ) in die DB schreibe. Also brauche ich diese Zusammenrechnungsschleife.
Danke Dir.
Bitte warten ..
Mitglied: QuasimodosKlon
01.01.2010 um 17:19 Uhr
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.
Bitte warten ..
Mitglied: bujutsu
01.01.2010 um 17:45 Uhr
na dann mach ich mich mal ran. Vielen Dank nochmals
Bitte warten ..
Mitglied: QuasimodosKlon
01.01.2010 um 18:03 Uhr
Nicht zu danken ;)

Und noch das mit dem SQL, das Du in der selben schleife zusammenbauen kannst... hier nochmal isoliert:
01.
$values = array(); 
02.
for ($i = 0; $i < count($_POST[leistung]); $i++) 
03.
04.
  $values[] = "('{$_POST[leistung][$i]}', '{$_POST[wert][$i]}', '{$_POST[anzahl][$i]}')"
05.
06.
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.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
PHP
gelöst Php regex und Array (5)

Frage von Thomas91 zum Thema PHP ...

C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

DNS
IPv6 und dynamisches DNS (3)

Frage von ukulele-7 zum Thema DNS ...

C und C++
String einlesen in Array und wieder ausgeben von hinten (4)

Frage von Protected zum Thema C und C ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
Suche passender Treiber (12)

Frage von stolli zum Thema Windows Server ...