Top-Themen

Aktuelle Themen (A bis Z)

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, 7899 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 ..
Ähnliche Inhalte
Batch & Shell
Leere Array-Werte aus einem Array entfernen
gelöst Frage von ToniHoBatch & Shell3 Kommentare

Hallo zusammen, ich bin dabei ein Powershell-Script zu schreiben, welches diverse Reports generieren kann. Für die Eingabe von SamAccountNames ...

Batch & Shell
Array oder Object oder wie soll ich das machen
gelöst Frage von Druide83Batch & Shell4 Kommentare

Hallo, mal wieder verzweifelt. Wahrscheinlich ist die Lösung einfach, aber ich habe gerade keinen Kopf mehr zum klar denken. ...

Batch & Shell
Dynamisches Script
Frage von TommyDerWalkerBatch & Shell1 Kommentar

Hallo zusammen, vllt könnt ihr mir helfen! Ich habe eine VM als Dienst eingerichtet, und da ich das in ...

Exchange Server
Dynamische Verteilergruppe
gelöst Frage von justdanExchange Server9 Kommentare

Hallo, Ich habe ne eine interessante und glaube leichte Frage an Euch. Also ich wollte gern 2 neue Mitglieder ...

Neue Wissensbeiträge
Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 4 StundenLinux12 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 TagHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Heiß diskutierte Inhalte
Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux12 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Windows 10
Alle Programme mit bestimmtem Namen automatisch (per GPO) deinstallieren
gelöst Frage von lordofremixesWindows 1012 Kommentare

Hallo zusammen, gibt es eine Möglichkeit, alle Programme beginnend mit z.B. "Dell" im Namen per Script und somit per ...