配列要素には、クエリ、構造体、他の配列など、任意の値を保存できます。配列の値は、代入ステートメントを使用して設定できます。また、ArraySet、ArrayAppend、ArrayInsertAt、および ArrayPrepend などの関数を使用して配列のデータを設定することもできます。これらの関数は、既存の配列にデータを追加するときに役立ちます。
特に、次のテクニックを使用すると便利です。
- ArraySet 関数を使用した配列データの設定
- cfloop タグを使用した配列データの設定
- クエリからの配列データの設定
ArraySet 関数を使用した配列データの設定
ArraySet 関数を使用すれば、1 次元配列または多次元配列の 1 つの次元に、空の文字列や 0 などの初期値を設定できます。この関数は、特定のサイズの配列を用意する必要はあるが、個別のデータを追加する必要はない場合に便利です。例えば、すべての配列インデックスを参照できるようにしておく場合などに使用します。空の文字列のように、値が含まれていない配列インデックスを参照すると、エラーが発生します。
ArraySet 関数の形式を次に示します。
ArraySet (arrayname, startrow, endrow, value)
次の例では、配列 myarray のインデックス 1 から 100 を空の文字列で初期化します。
ArraySet (myarray, 1, 100, "")
cfloop タグを使用した配列データの設定
cfloop タグは、配列にデータを設定するときによく使用される効率的な方法です。次の例では、cfloop タグと MonthAsString 関数を使用して、単純な 1 次元配列に月の名前を設定しています。2 番目の cfloop によって、配列内のデータがブラウザーに出力されます。
<cfloop index="loopcount" from=1 to=12> <cfset months[loopcount]=MonthAsString(loopcount)> </cfloop> <cfloop index="loopcount" from=1 to=12> <cfoutput> #months[loopcount]#<br> </cfoutput> </cfloop>
2 次元配列や 3 次元配列でのネストループの使用
2 次元配列や 3 次元配列の値を出力するには、配列データを返すためにネストループを使用します。1 次元配列のデータを出力するには、前の例のように、1 つの cfloop で十分です。多次元配列では、配列の各レベルで別個のループカウンタを設定します。
2 次元配列での cfloop タグのネスト
次の例では、ネストされた cfloop タグを使用して、2 次元配列のデータを出力しています。同様に、ネストされた cfloop タグを使用して配列データを設定しています。
<cfloop index="loopcount" from=1 to=12> <cfloop index="loopcount2" from=1 to=2> <cfset my2darray[loopcount][loopcount2]=(loopcount * loopcount2)> </cfloop> </cfloop> <p>The values in my2darray are currently:</p> <cfloop index="OuterCounter" from="1" to="#ArrayLen(my2darray)#"> <cfloop index="InnerCounter" from="1"to="#ArrayLen(my2darray[OuterCounter])#"> <cfoutput> <b>[#OuterCounter#][#InnerCounter#]</b>: #my2darray[OuterCounter][InnerCounter]#<br> </cfoutput> </cfloop> </cfloop>
3 次元配列での cfloop タグのネスト
3 次元配列では、cfloop タグをもう 1 回ネストします。この例では、コードを短くするため、配列値の設定はおこなっていません。
<cfloop index="Dim2" from="1" to="#ArrayLen(my3darray[Dim1])#"> <cfloop index="Dim3" from="1"to="#ArrayLen(my3darray[Dim1][Dim2])#"> <cfoutput> <b>[#Dim1#][#Dim2#][#Dim3#]</b>: #my3darray[Dim1][Dim2][Dim3]#<br> </cfoutput> </cfloop> </cfloop> </cfloop>
クエリからの配列データの設定
クエリから配列のデータを設定するときは、次の点に注意してください。
<cfset arrayName[index]=queryColumn[row]> In the following example, a cfloop tag places four columns of data from a sample data source into an array, myarray. <cfquery name="test" datasource="cfdocexamples"> SELECT Emp_ID, LastName, FirstName, Email FROM Employees </cfquery> <!--- Declare the array ---> <cfset myarray=arraynew(2)> <!--- Populate the array row by row ---> <cfloop query="test"> <cfset myarray[CurrentRow][1]=Emp_ID> <cfset myarray[CurrentRow][2]=LastName> <cfset myarray[CurrentRow][3]=FirstName> <cfset myarray[CurrentRow][4]=Email> </cfloop> <!--- Now, create a loop to output the array contents ---> <cfset total_records=test.recordcount> <cfloop index="Counter" from=1 to="#Total_Records#"> <cfoutput> ID: #MyArray[Counter][1]#, LASTNAME: #MyArray[Counter][2]#, FIRSTNAME: #MyArray[Counter][3]#, EMAIL: #MyArray[Counter][4]# <br> </cfoutput> </cfloop>
この例では、クエリオブジェクトのビルトイン変数である CurrentRow を使用して、配列の最初の次元のインデックスを指定しています。
型付き配列
ColdFusion の 2018 リリースでは、関連する一連の型を使用した配列や構造体の宣言をサポートします。
以前のバージョンの ColdFusion では、次のコードを使用して配列を作成できていました。
<cfscript> arr=arrayNew() // or arr=[]; arr=["hello","world"]; writeDump(arr); </cfscript>
型を使用すると、上記のコードを次のように書き換えることができます。
<cfscript> arr=arrayNew["String"](1); arr.append("hello"); arr.append("world"); writeDump(arr); </cfscript>
出力は文字列の配列です。
サポートされる型は次のとおりです。
- 文字列
- 数字
- Boolean
- 日付/ 日時
- 配列
- 構造体
- クエリ
- コンポーネント
- CFC(名前/サブタイプ別)
- バイナリ
- 関数
型の宣言をおこなうと、宣言した型のデータのみを挿入できます。データ型の詳細については、データ型開発ガイドを参照してください。
さらに、次のサポートも提供します。
- CFS を挿入しながらの継承
- 型付き配列に含まれる型を取得する関数 getType
- メソッド引数における型付き配列(例:numeric function getMax(numeric[] numbers))
- メソッド戻り方における型付き配列(例:Student[] function getStudents(numeric[] studentIds))
配列のスライシング
ColdFusion では、配列のスライシングとは、開始位置と終了位置に応じて、配列から要素を抜き出すことを意味します。
例えば、次のスクリプトの場合は、
<cfscript> a=[1,2,3,4,5,6,7,8] writedump(a[1:6]) </cfscript>
出力
のようになります。次も同様です。
<cfscript> a=[1,2,3,4,5,6,7,8] writedump(a[1:6:2]) // In steps of 2 </cfscript>
配列のスライシングにおけるステップ幅の使い方は、Array[ start : end : step] のようになります。
<cfscript> a=[1,2,3,4,5,6,7,8] writedump(a[5:]) // from index 5 till the end of the array </cfscript>
<cfscript> a=[1,2,3,4,5,6,7,8] writedump(a[:3]) // All elements till index 3, exclusive of index 3 </cfscript>
<cfscript> a=[1,2,3,4,5,6,7,8] writedump(a[:]) // returns the entire array </cfscript>
ネガティブインデックスを使用した場合は次のようになります。
<cfscript> a=[1,2,3,4,5,6,7,8] writedump(a[:-5]) // Returns all elements from the array, except the last 5 elements </cfscript>
<cfscript> a=[1,2,3,4,5,6,7,8] writedump(a[:-2:2]) </cfscript>
<cfscript> values = ["Aa","Bb","Cc","Dd","Ee"] odds = values[::2] writedump(odds) </cfscript>
範囲を使用した配列表記による部分文字列
ColdFusion(2018 リリース)では、配列のスライシングをサポートするようになりました。スライシングでは、開始位置と終了位置さらにはオプションのステップ幅に応じて、配列から要素を抜き出すことができます。配列のスライシングについて詳しくは、上記の節を参照してください。
ColdFusion(2018 リリース)アップデート 5 では、スライシングは文字列にも適用できるようになりました。
位置範囲に基づく配列表記を使用して、部分文字列に簡単にアクセスすることができます。
シンタックス
a[start:stop:step]
次に例を示します。
<cfscript> mystring = "Hello ColdFusion. What’s Up!!"; writeOutput(mystring[1] & "<br/>"); // Returns H writeOutput(mystring[-3] & "<br/>"); // Returns p writeOutput(mystring[4:13:2] & "<br/>"); // Returns l odu writeOutput(mystring[4:12] & "<br/>"); // Returns lo ColdFu writeOutput(mystring[-14:-4:2]); // Returns o.WasU </cfscript>
配列の非構造化
配列の非構造化では、配列要素を値として使用して新しい変数を作成できます。
注意:複数の配列ステートメントにはセミコロンを使用する必要があります。例えば、次のように入力します。
nestedArray = [1, 2, [3, 4], 5]; // セミコロンがないと失敗します。
[one, two, [three, four], five] = nestedArray
従来の方法を使用する場合は、例えば、次のようになります。
<cfscript> beatles=["John","Paul","George","Ringo"] b1=beatles[1] b2=beatles[2] b3=beatles[3] writeOutput(b1) writeOutput(b2) writeOutput(b3) </cfscript>
非構造化を使用すると、上記のコードは次のように書き換えることができます。
<cfscript> // using destructuring beatles = ["John","Paul","George","Ringo"]; [b1,b2,b3,b4] = beatles writeDump(b1) writeDump(b2) writeDump(b3) writeDump(b4) </cfscript>
余分な値の無視
<cfscript> arr = [100, 200, 300] [firstVal, secondVal] = arr writeDump(firstVal) // 100 writeDump(secondVal) //200 </cfscript>
レスト演算子の使用
<cfscript> arr = [100, 200, 300, 400, 500]; [firstVal, secondVal, ...rest] = arr; writeDump(firstVal); writeDump(secondVal); writeDump(rest); </cfscript>
final キーワードを使用した非構造化
<cfscript> final {as, bs, ...rest} = { as: 40, bs: [111,122,133], c:23, d:{CFPREV:"2018",CF_CURR:"2020"}, e [21,22,34] } writeDump(as); writeDump(bs); writeDump(rest); </cfscript>