![]() |
Bedingte Anweisung in Schleife
Ich habe eine Schleife über ein Array mit Feldnamen:
Delphi-Quellcode:
In dieser Schleife wird jedem Feldnamen ein Standardwert zugeordnet*. Jetzt gibt es aber Felder, denen sollen spezifische Werte zu geordnet werden. Zum Beispiel soll das Feld name nicht den Standardwert erhalten, sondern einen von mir vorgegebenen. Es soll auch möglich sein mehrere beliebige Felder mit von mir vorgegebenen Werten zu belegen, also auch zum Beispiel den Feldern name, key und pop. Alle anderen Felder sollen aber den Standardwert erhalten.
var
fields: array[0..6] of string = ('name', 'desc', 'key', 'foo', 'bar', 'lolli', 'pop'); procedure TForm5.Button1Click(Sender: TObject); var i: Integer; s: string; begin Memo1.Lines.Clear; for i := 0 to high(fields) do begin s := setDefaultvalue('name', 'Name'); // ...; // ...; s := fields[i] + #9 + ': ' + 'Standardwert'; Memo1.Lines.Add(s); end; end; Bisherige Ausgabe:
Code:
Gewünschte Ausgabe:
name : Standardwert
desc : Standardwert key : Standardwert foo : Standardwert bar : Standardwert lolli : Standardwert pop : Standardwert
Code:
Damit das ganze einfach gehandhabt werden kann, soll es eine Funktion geben, der ich das betreffende Feld und den gewünschten Wert übergebe. So dass ich einfach und schnell einem Feld einen Wert zu weisen kann:
name : name
desc : Standardwert key : Hubba foo : Standardwert bar : Standardwert lolli : Standardwert pop : Bubba
Delphi-Quellcode:
Mein Problem ist jetzt, dass ich bisher noch keine funktionierende Lösung gefunden habe. Und ich habe mir darüber schon Stunden den Kopf zerbrochen. Deswegen hoffe ich, dass hier jemanden eine Lösung einfällt.
function setDefaultValue(const field, value: string): string;
var i: Integer; begin Result := ''; for i := 0 to high(fields) do begin if fields[i] = field then begin Result := field + #9 + ': ' + value; end end; end; Zum Nachbauen braucht ihr nur ein Memo und eine Schaltfläche auf der Form. *) Dies ist nur ein vereinfachtes Beispiel. In Wirklichkeit muss ich dies in PHP umsetzen und das ganze ist auch noch etwas komplexer. Aber es geht um die Logik und ich habe es auf das Wesentliche runtergebrochen. PS: Wem ein besserer Threadtitel einfällt, kann diesen gerne nennen. ;) |
Re: Bedingte Anweisung in Schleife
Also in PHP könntest Du ein String-indiziertes Array verwenden, um sowohl Standardwerte als auch eigene Werte festzulegen :)
zum Beispiel:
Code:
Dort wo kein spezieller Standardwert festgelegt ist, könntest Du ja einen globalen Standardwert nehmen...
$fields = array('name' => 'CustomDefault', 'desc' , 'key' => 'OtherCustomDefault', 'foo', 'bar', 'lolli', 'pop');
foreach($fields as $fieldName => $customDefault){ $defaultValue = ($customDefault ? $customDefault : 'Globaler Standardwert'); echo "$fieldName: $defaultValue"; } Viele Grüße |
Re: Bedingte Anweisung in Schleife
Das Problem ist, ich habe dies nicht nur einmal. Sondern 30 mal und es gibt Fälle da muss ich bis zu 15 Felder Berücksichtigen. Die Schleife von der Schaltfläche wird nicht nur einmal durchlaufen, sondern 30 mal. Und wenn ich da für jeden Fall jedes mal so ein Array zusammenbasteln muss, finde ich das nicht sehr schön und einfach zu handhaben. Vor allem, weil ich nicht nur das Feld kennen muss, welches ich anders belegen möchte, sondern ich muss dann ja alle Felder kennen.
Ich werde die Lösung erst mal im Hinterkopf behalten. Eventuell ist sie ja doch nicht so schlecht. Man muss eben nur einmal die Arrays für alle 30 Fälle erstellen. (Und da bin ich zu faul zu. ;) Es kann außerdem sein, dass zu den 30 noch mehr dazu kommt.) |
Re: Bedingte Anweisung in Schleife
Die erste Verbesserung könnte dann ja sein, in dem Fields array wirklich nur die Felder mit eigenem Standardwert festzuhalten und "allen anderen" den Default-Wert zuzuweisen. Im Beispiel müsstest Du dann nur noch "name" und "key" im Array haben. :)
Viele Grüße |
Re: Bedingte Anweisung in Schleife
Ok, muss ich dazu an dem restlichen Code von dir in der Schleife etwas ändern? PHP ist noch nicht so meine Stärke.
Delphi-Quellcode:
Ich glaube, ich hätte auch den Rest posten sollen. Obiger Code modelliert die Wirklichkeit etwas besser. Nur dass es keine äußere Schleife gibt, sondern das ist eine Vorlage, die für jedes Model aufgerufen wird. Das heißt die äußere Schleife in obigen Code liegt in einem Script. So, und in den Models Produkt, Kategorie[u und Wsehrung sollen jetzt bestimmte Felder Sonderwerte erhalten. Die Felder aller anderen Kategorien sollen auch die Standardwerte erhalten. Wobei jedes Model andere Felder hat.
var
ProduktFields: array[0..6] of string = ('name', 'desc', 'key', 'foo', 'bar', 'lolli', 'pop'); procedure TForm5.Button1Click(Sender: TObject); var i j: Integer; s: string; begin for j := 0 to high(models) do begin Memo1.Lines.Clear; if models[j] = 'Produkt' then begin for i := 0 to high(ProduktFields) do begin //s := setDefaultvalue('name', 'Name'); // ...; // ...; s := fields[i] + #9 + ': ' + 'Standardwert'; Memo1.Lines.Add(s); end; end else if models[j] = 'Kategorie' then begin end; end; end; |
Re: Bedingte Anweisung in Schleife
Sind die abweichenden Werte denn für alle Modelle die selben?
Sind "nur" keine Modifikationen :)
Code:
// sind das pro Modell die selben? Falls nicht (sonst wie oben)
$fields = ('Produkt' => array('name', 'desc', 'key', 'foo', 'bar', 'lolli', 'pop'), 'Kategorie[u' => array('andere Felder', '...')); // Falls für alle Modelle gleich: $customValues = ('name' => 'Anders', 'key' => 'Wieder anders'); // sonst (z.B.) $customValues = ('Produkt' => array('name' => 'Anders für Produkt'), 'Kategorie[u' => array('foo' => 'Anders für Kategorie')); foreach($models as $model) foreach($fields[$model] as $field){ $defaultValue = $customValues[$field] or 'Standardwert'; // Falls für jedes Modell anders: $defaultValue = $customValues[$model][$field] or 'Standardwert'; // echo "$field: $defaultValue"; } |
Re: Bedingte Anweisung in Schleife
Nein für jedes Model gibt es für die Felder unterschiedliche Werte, da die Modelle auch unterschiedliche felder haben. Ich habe noch mal probiert es zu verdeutlichen:
Code:
Die foreach-Schleife würde ich dann noch in eine Funktion auslagern, der ich nur die Feldliste übergebe.
$productFields = array('name' => 'Name', 'key' => 'key', 'desc' => 'desc');
$categoryFields = array('name' => 'ajsdbv', 'kuckuck' => 'jsgad'); switch ($model){ case 'Produkt': foreach($productFields as $fieldName => $customDefault){ $defaultValue = ($customDefault ? $customDefault : 'Globaler Standardwert'); echo "$fieldName: $defaultValue"; } break; case 'Kategorie': foreach($categoryFields as $field => $customDefault){ break; default: echo "$fieldname: ' Globaler Standardwert"; break; } } |
Re: Bedingte Anweisung in Schleife
Ich kann das leider hier zu Hause nicht testen, aber würde obiger Code das machen, was ich vorhabe?
|
Re: Bedingte Anweisung in Schleife
Sind noch zwei kleine Syntaxfehler drin:
Code:
So läuft der Test-Code korrekt bei mir. Ausgabe ist:
$productFields = array('name' => 'Name', 'key' => 'key', 'desc' => 'desc');
$categoryFields = array('name' => 'ajsdbv', 'kuckuck' => 'jsgad'); $model = "Produkt"; switch ($model){ case 'Produkt': foreach($productFields as $fieldName => $customDefault){ $defaultValue = ($customDefault ? $customDefault : 'Globaler Standardwert'); echo "$fieldName: $defaultValue"; } break; case 'Kategorie': foreach($categoryFields as $field => $customDefault){ } break; default: echo "$fieldname: Globaler Standardwert"; break; }
Code:
name: Name
key: key desc: desc |
Re: Bedingte Anweisung in Schleife
Und wo sind die anderen Felder mit den Standardwerten? Die brauche ich auch. Sie meine gewünschte Beispielausgabe weiter oben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz