2012-03-31 8 views
1

Ich versuche, zwei dynamisch zugewiesene Variablen zu bewerten; dann versucht, eine dynamische Variable basierend auf dem Ergebnis zuzuweisen. Ich habe viel längeren Code, wo das funktioniert, aber ich versuche zu konsolidieren. HierColdFusion Schleife geschachtelt Pfundzeichen Problem

ist, was ich für die konsolidierte Code haben:

<cfloop list="dog,cat,pig,horse" index="i">  
    <cfif (#trim([i]_FMCTotal)# /2) GT #trim([i]_FMC)#> 
     <cfset #i#colorCode = 'red'> 
    <cfelseif (#trim([i]_FMCTotal)# /1.5) GT #trim([i]_FMC)#> 
     <cfset #i#colorCode = 'yellow'> 
    <cfelse> 
     <cfset #i#colorCode = 'green'> 
    </cfif> 
</cfloop> 
+1

Phils Antwort sieht am besten aus. Ich wollte nur darauf hinweisen, dass es eine sehr spezifische Verwendung von Pfundzeichen in CF gibt und das ist für die String-Interpolation. Dann haben Sie eine Zeichenfolge und möchten eine Variable oder einen Ausdruck in der Mitte ausfüllen. In zwei Fällen wird dies verwendet. Erstens, wenn Sie eine Zeichenkette machen, können Sie dies zum Beispiel tun . Der andere ist bei der Erzeugung der Ausgabe zum Beispiel Mein Bruder sagte gerade # Phrase # zu meiner Mutter. Das Einschließen von Nummernzeichen in anderen Situationen kann zwar keinen Fehler erzeugen, aber keinen Zweck erfüllen. –

Antwort

7

nicht viel von dem Code, den Sie geschrieben haben, würde durch den Parser erhalten, wie Sie einige ungültige CFML-Konstrukte haben wie [i]_FMCTotal, die kein gültiges ist Variablennamen. Auch Ihre Verwendung der Hashes ist innerhalb der bedingten Anweisungen nicht erforderlich, die Hashes werden für die Ausgabe verwendet.

Um die Frage zu beantworten gibt es evaluate() aber eine viel besser lesbare, sichere und wartbare Lösung wäre, eine Struktur für die Farbcodes zu nutzen.

<cfset colorCodes = {}> 
<!--- presuming ..._FMCTotal and .._FMC are reworked as structs also ---> 
<cfloop list="dog,cat,pig,horse" index="i">  
    <cfif (FMCTotal[i] /2) GT trim(FMC[i])> 
     <cfset colorCode[i] = 'red'> 
    <cfelseif (trim(FMCTotal[i] /1.5) GT trim(FMC[i])> 
     <cfset colorCode[i] = 'yellow'> 
    <cfelse> 
     <cfset colorCode[i] = 'green'> 
    </cfif> 
</cfloop> 

Das Ergebnis würde dies eine Datenstruktur sein, von dem Sie bequem eines der Elemente Wert in nachfolgenden Code

{ // possible result 
    'pig': 'green' 
    , 'cat': 'yellow' 
    , 'dog': 'red' 
    , 'horse': 'green' 
} 

colorCode['dog'] // => 'red' 

Wenn Sie Sie die _FMC Variablen zu überarbeiten haben keinen Zugang zugreifen können könnte diese evaluate('#i#_FMCTotal') auswerten, aber es wäre viel sauberer, eine Sammlung für diese auch wie in meinem Beispiel zu verwenden.

+1

Danke Phil und Mark und Dan. Ich las gerade Bamboozled durch Pfund-Zeichen-Entscheidungen (http://www.coldfusionmuse.com/index.cfm/2011/2/10/when.do.i.use.pound.signs). Ich schätze den Input sehr. – Fergus

+0

Phil, dein Code hat funktioniert. Ich musste nur ein ")" am Ende des cfelseif hinzufügen: . Danke euch sehr vielmals ... – Fergus

1

Phil ist richtig - Ihre Syntax ist nicht korrekt. Wenn das, was Sie versuchen, mit

zu tun ist, ob die Variable pig_FmcTotal geteilt durch 2 ist größer als pig_FMC, dann sollten Sie tun so etwas wie:

<cfif val(variables[i & '_FMCTotal'])/2 gt val(variables[i & '_FMC'])> 

Ich gehe davon aus, dass _FMC ist eigentlich eine Zeichenkette hier, aber wenn es eine Variable wäre, würden Sie die obigen einfachen Anführungszeichen entfernen. Verwenden Sie die Klammernotation und verketten Sie den Schlüsselnamen innerhalb der Klammer. Es gibt andere Möglichkeiten, dies zu tun (zum Beispiel bewerten).

Wenn es darum geht, es ist die gleiche Routine zu setzen:

<cfset variables[i & colorscheme] = 'green'/> 

Viel Glück.