2016-07-01 10 views
2

エラーが発生しました変数ARRAYCONTAINSは未定義です。私の構文に何が問題なのか分かりません。Arraycontains undefined coldfusion

はここに私のコードです:それは自己完結型の例があるので

<cfoutput> 
    <cfinvoke method="estimatedShipping" state="CA" returnvariable="days"/> 
    CA: #days# 
    <br> 
</cfoutput> 

<cffunction name="estimatedShipping" output="false" returntype="any"> 
    <cfargument name="state" type="string" required="yes"/> 

    <cfset oneDayStates = ["CA"] > 
    <cfset twoDayStates = ["WA","OR","NV","ID","AZ", "UT"] > 
    <cfset threeDayStates = ["MT","WY","CO","NM"] > 
    <cfset fourDayStates = ["ND","SD","NE","KS","OK","TX","MN","IA","MO","AR","LA", "WI","MI","IL","IN","KY","TN","MS","AK","AL","GA","OH","WV"] > 
    <cfset fiveDayStates = ["ME","VT","NY","NH","MA","RI","CT","NJ","PA","MD","DE","VA","NC","SC","FL", "HI"] > 

    <cfif #arrayContains(oneDayStates, state)# eq 'YES'> 
     <cfset count = "1"> 
    <cfelseif #arrayContains(twoDayStates, state)# eq 'YES'> 
     <cfset count = "2"> 
    <cfelseif #arrayContains(threeDayStates, state)# eq 'YES'> 
     <cfset count = "3"> 
    <cfelseif #arrayContains(fourDayStates, state)# eq 'YES'> 
     <cfset count = "4"> 
    <cfelseif #arrayContains(fiveDayStates, state)# eq 'YES'> 
     <cfset count = "5"> 
    <cfelse> 
     <cfset count = "5+"> 
    </cfif> 
    <cfreturn count /> 
</cffunction> 
+3

使用しているColdFusionのバージョンは何ですか? ColdFusion 9では 'arrayContains'が導入されました。それ以外にも、条件文で'# 'を使って関数呼び出しをラップする必要はありません。 – Alex

答えて

2

http://trycf.com上で実行します。 It works with CF10 and Lucee。したがって、技術的に間違っていることはありません。おそらくthat functionをサポートしていない古いバージョンを使用しています。お使いのCFのバージョンを確認してください:

<cfdump var="#server.coldfusion.productversion#"> 

この機能の代わりに、http://cflib.orgをご覧ください。彼らはあなたが代替品として使うことができるもの、または少なくともArrayContains UDFのようなものの基礎となるものを持っているかもしれません。つまり、通常、このタイプの情報をデータベースに格納します。それがオプションではないと仮定すると、構造体の使用がより簡単になるかもしれません。出荷日数を「キー」として使用し、状態のリストを「値」として使用します。

<cfset shipping = {} > 
<cfset shipping[1] = "CA" > 
<cfset shipping[2] = "WA,OR,NV,ID,AZ,UT" > 
<cfset shipping[3] = "MT,WY,CO,NM" > 
<cfset shipping[4] = "ND,SD,NE,KS,OK,TX,MN,IA,MO,AR,LA,WI,MI,IL,IN,KY,TN,MS,AK,AL,GA,OH,WV" > 
<cfset shipping[5] = "ME,VT,NY,NH,MA,RI,CT,NJ,PA,MD,DE,VA,NC,SC,FL,HI" > 

<cfset result = "5+"> 
<cfloop collection="#shipping#" item="days"> 
    <cfif listFindNoCase(shipping[ days ], stateCodeToFind)> 
     <cfset result = days > 
     <cfbreak> 
    </cfif> 
</cfloop> 

CFIF に質問とは何の関係が、

  1. 必ずvarまたはlocal範囲すべて機能のローカル変数
  2. 過剰シャープ記号のための必要性を全く
  3. ArrayContainsはブール値を返すのでシンプルですRの書き込みに:

    <cfif arrayContains(oneDayStates, state)> 
    

    を代わりに

    <cfif arrayContains(oneDayStates, state) eq 'YES'> 
    
+1

''を ''に変更すると、その例は正しいでしょう。 ;) – Alex

+0

@Alex - うん、あなたは正しい。 – Leigh

1

のここでは以下のColdFusion 8とするためのソリューションです:

<cffunction name="estimatedShipping" output="false" returntype="any"> 
    <cfargument name="state" type="string" required="yes"> 

    <cfset var LOCAL = structNew()> 

    <cfset LOCAL.oneDayStates = ["CA"]> 
    <cfset LOCAL.twoDayStates = ["WA", "OR", "NV", "ID", "AZ", "UT"]> 
    <cfset LOCAL.threeDayStates = ["MT", "WY", "CO", "NM"]> 
    <cfset LOCAL.fourDayStates = ["ND", "SD", "NE", "KS", "OK", "TX", "MN", "IA", "MO", "AR", "LA", "WI", "MI", "IL", "IN", "KY", "TN", "MS", "AK", "AL", "GA", "OH", "WV"]> 
    <cfset LOCAL.fiveDayStates = ["ME", "VT", "NY", "NH", "MA", "RI", "CT", "NJ", "PA", "MD", "DE", "VA", "NC", "SC", "FL", "HI"]> 

    <cfset ARGUMENTS.state = uCase(ARGUMENTS.state)> 

    <cfif LOCAL.oneDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "1"> 
    <cfelseif LOCAL.twoDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "2"> 
    <cfelseif LOCAL.threeDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "3"> 
    <cfelseif LOCAL.fourDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "4"> 
    <cfelseif LOCAL.fiveDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "5"> 
    <cfelse> 
     <cfset LOCAL.count = "5+"> 
    </cfif> 

    <cfreturn LOCAL.count> 
</cffunction> 

私も矛盾を固定し、適切にあなたのローカルスコープ変数。

+2

Alex - 答えはありませんが、この特定のケースではindexOfの使用はお勧めしません。その理由は次のとおりです。[indexOf](http://docs.oracle.com/javase/7/docs/api/java/util/List.html#indexOf(java.lang.Object))は、*ロット*の許容量が少ないCF関数を使用した後ではほとんどの場合期待しています。 CFと違って、javaのindexOfは、大文字と小文字の両方に敏感です。 '" 15 "'を検索すると、 'val(15)'の検索とは異なる結果が得られます。予期せぬ動作の可能性を考えれば、純粋なCF IMOを守る方が良いでしょう。少なくともあなたが期待する結果を生み出す可能性の高いもの。ちょうど私の2¢ – Leigh

+0

本当ですが、私はそれがこの場合安全だと思います。彼は文字列を渡し、配列に文字列を持っています。しかし、あなたは 'indexOf'、' contains'などを意識しているのです。 – Alex

+0

(編集)他のオプションが存在するので、私はまだ同意しません。しかし、もしそれを使うなら、少なくとも大文字の 'arguments.state 'であるか、または指定された値が別の大文字小文字の場合は一致しません;-) – Leigh