配列要素には、クエリ、構造体、他の配列など、任意の値を保存できます。配列の値は、代入ステートメントを使用して設定できます。また、ArraySetArrayAppendArrayInsertAt、および 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>

クエリからの配列データの設定

クエリから配列のデータを設定するときは、次の点に注意してください。

  • すべてのクエリデータを配列に一度に追加することはできません。通常、クエリから配列データを設定するには、ループ処理が必要です。
  • クエリ列のデータは、配列と同じシンタックスを使用して参照できます。例えば、myquery.col_name1 とすると、myquery というクエリの col_name という列の最初の行のデータを参照できます。
  • cfloop query= ループの内側では、クエリの変数を参照するためにクエリ名を指定する必要はありません。
    cfset タグで次のシンタックスを使用すると、配列インデックスの値を定義できます。
<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>

出力

1

のようになります。次も同様です。

<cfscript>
	a=[1,2,3,4,5,6,7,8]
	writedump(a[1:6:2]) // In steps of 2
</cfscript>
<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>

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー