ColdFusion 配列は、ColdFusion でのプログラム作成に欠かせない基本要素です。配列は、データ型が同じデータ項目の順序付きスタックにすぎません。配列を使用すると、複数の値をただ 1 つの名前で保存することができます。項目ごとに別個の変数を使用するのではなく、1 つの配列を使用してすべての項目を格納することができます。
配列の作成
ColdFusion での配列の作成方法には、明示的な方法と暗黙的な方法の 2 通りがあります。明示的な方法では、関数を使用して配列を宣言し、それにデータを代入します。暗黙的な方法では、代入ステートメントを使用します。単純な配列も複雑な(多次元の)配列も作成できます。
配列を明示的に作成するには、ArrayNew 関数を使用して、配列の次元を指定します。次に例を示します。
myArray = ArrayNew (2)
このステートメントでは、myArray という 2 次元配列を作成しています。この方法を使用して作成できる配列は、3 次元までです。
配列を作成したら、配列要素を追加できます。配列要素を参照するには、要素のインデックスを使用します。
例えば、firstName という 1 次元配列を作成できます。
firstName = ArrayNew (1)
配列 firstName にはデータが格納されていません。以下のように、この配列にデータを追加すると、
firstName [2] = "John" firstName [3] = "Jason"
配列の長さが 3 になります。配列の内容をダンプすると、次の出力が得られます。
また、配列を暗黙的に作成することもできます。配列を暗黙的に作成するには、代入ステートメントの左辺で新しい変数名を使用し、代入ステートメントの右辺で配列表記を使用します。次に例を示します。
firstNameImplicit=[“John”,”Jason”,”James”]
この単一のステートメントは、関数を使用した配列の作成で firstname 配列の作成に使用した 4 つのステートメントと同等です。
配列を暗黙的に作成する場合、代入分ステートメントの右辺では、配列の内容を囲む角括弧([])と、個々の配列要素を区切るカンマを使用します。要素はリテラル値(この例の文字列など)、変数、または式です。変数を指定する場合、変数名は引用符で囲みません。
空の配列を暗黙的に作成するには、次の例のようにします。
myArray=[]
また、単一のエントリを割り当てることで、配列を暗黙的に作成することもできます。次に例を示します。
myArray [1] = "ColdFusion"
ColdFusion では、ネストした配列、ネストした構造体、ネストした配列と構造体を暗黙的に作成することもできます。次に例を示します。
jazzmen = [["Coleman"、"Charlie"]、["Hawkins"、"Parker"]
2 次元配列を作成する場合は、次のように記述します。
cp = ["Charlie", "Parker"] dg = ["Dexter", "Gordon"]
すべてまとめると、次のようなコードになります。
<cfscript> cp = ["Charlie", "Parker"] dg = ["Dexter", "Gordon"] jazzmen = [["Coleman","Charlie"],["Hawkins", "Parker"]] players=[cp,dg,jazzmen] writeDump(players) </cfscript>
出力
多次元配列の作成
ColdFusion では、ダイナミックな多次元配列がサポートされています。ArrayNew 関数を使用して配列を宣言する場合は、次元数を指定できます。また、非対称配列を作成したり、配列を配列要素としてネストすることで配列の次元数を増やすことができます。
ある配列(配列 1)を別の配列(配列 2)の要素として割り当てると、配列 1 が配列 2 の中にコピーされることに注意してください。コピー元の配列 1 は、配列 2 とは関係なくそのまま存在します。したがって、2 つの配列の内容はそれぞれ独立に変更できます。
非対称配列を理解するには、実際の配列を見るのが効果的です。次の例では、非対称の多次元配列を作成し、作成した配列の構造を cfdump タグで表示しています。まだデータを含んでいない配列要素もあります。
<cfscript> myotherarray=ArrayNew(2); biggerarray=ArrayNew(3); myarray=[]; biggerarray[1][1][1]=myarray; biggerarray[1][1][1][10]=3; biggerarray[2][1][1]=myotherarray; biggerarray[2][1][1][4][2]="five deep"; biggestarray=ArrayNew(3); biggestarray[3][1][1]=biggerarray; biggestarray[3][1][1][2][3][1]="This is complex"; myarray[3]="Can you see me"; writeDump(biggestarray); writeDump(myarray); </cfscript>
出力
コードを分解すると、以下のようになります。
1. 2 次元、3 次元、1 次元の空の配列をそれぞれ作成します。
myotherarray = ArrayNew (2); biggerarray = ArrayNew (3); myarray = []
2. 3 次元配列の要素 [1][1][1] に 1 次元配列をコピーします。
biggerarray [1] [1] [1] = myarray;
3. 得られた配列の要素 [1][1][1][10] に 3 を代入します。これで biggerarray 配列が非対称になりました。例えば、この配列には要素 [1][1][2][1] がありません。
biggerarray[1][1][1][10]=3;
4. 3 次元配列の要素 [2][1][1] に 2 次元配列をコピーします。
biggerarray[2][1][1]=myotherarray;
5. [2][1][1][4][2] 要素に値「five deep」を代入します。これで biggerarray 配列がさらに非対称になりました。
biggerarray[2][1][1][4][2]="five deep";
6. 2 つ目の 3 次元配列を作成します。
biggestarray = ArrayNew (3);
7. この配列の要素 [3][1][1] に biggerarray 配列をコピーし、要素 [3][1][1][2][3][1] に値を代入します。得られた配列は、複雑で非対称です。
biggestarray[3][1][1][2][3][1]="This is complex";
8. myarray の要素 [3] に値を代入します。
myarray[3]="Can you see me";
9. writeDump を使用して biggestarray と myarray の構造を確認します。myarray には「Can you see me」というエントリがありますが、biggestarray にはありません。これは、biggestarray には元の myarray の値がコピーされており、その後で myarray が変更されても biggestarray には反映されないからです。
writeDump (biggestarray)。
配列への要素の追加
次の配列関数を使用して配列にデータを追加できます。
ArrayAppend
ArrayAppend 関数は配列に配列要素を追加します。 merge 引数が true に設定され、value 引数が配列の場合は、配列が連結されます。
次に例を示します。
<cfscript> myArray=[1,3,5,7,9] toAppend=ArrayAppend(myArray,11,true) writeOutput("Is the value appended successfully?"& toAppend & "<br/>") writeOutput("The modified array is:") writeDump(myArray) </cfscript>
出力
ArrayPrepend
ArrayPrepend 関数は配列の先頭に配列要素を挿入します。
次に例を示します。
<cfscript> myArray=[3,5,7,9,11] toPrepend=ArrayPrepend(myArray,1) writeOutput("Is the value pre-pended successfully?"& toPrepend & "<br/>") writeOutput("The modified array is:") writeDump(myArray) </cfscript>
出力
ArrayInsertAt
ArrayInsertAt 関数は配列に値を挿入します。新しいデータの位置と同じかそれより大きいインデックス値を持つ配列要素のインデックス値が 1 だけ増えます。
次に例を示します。
<cfscript> myCities=["London","New York","Paris","Tokyo","Barcelona"]; myNewCity="Berlin,Prague,Rome" ArrayInsertAt(myCities,4,myNewCity) writeOutput("The updated array is:") writeDump(myCities) </cfscript>
出力
配列の要素の削除
次の関数を使用して、配列から要素を削除できます。
ArrayDelete
ArrayDelete 関数は、指定されたオブジェクトが最初に出現する位置を配列内で検索して、見つかったオブジェクトを削除します。
次に例を示します。
<cfscript> myArray=["London", "New York", "Paris", "Barcelona", "Berlin", "Tokyo", "Seattle"]; ArrayDelete(myArray,"Paris") writeOutput("The modified array is:") writeDump(myArray) </cfscript>
出力
ArrayDeleteAt
ArrayDeleteAt 関数は、配列内の指定された位置にある要素を削除します。
次に例を示します。
<cfscript> myArray=["London", "New York", "Paris", "Barcelona", "Berlin", "Tokyo", "Seattle"]; // Delete element at 4th position ArrayDeleteAt(myArray,4) writeOutput("The modified array is:") writeDump(myArray) </cfscript>
出力
配列の反復処理
配列の反復処理には、以下の異なる構文を使用できます。
- for ループ
- cfloop タグ
- ArrayEach クロージャ
for ループ
for ループは次のように使用できます。
<cfscript> myCities=["London", "New York", "Paris", "Barcelona", "Berlin", "Tokyo", "Seattle"]; // for loop for (i=1;i<=ArrayLen(myCities);i++){ writeOutput("The city is:" & myCities[i] & "<br/>") } </cfscript>
出力
The city is:London
The city is:New York
The city is:Paris
The city is:Barcelona
The city is:Berlin
The city is:Tokyo
The city is:Seattle
cfloop タグ
cfloop 構文は次のように使用できます。
<cfset myArray = ["Australia", "Brazil", "Canada"]> <! --- By index ---> <cfloop index="i" from="1" to="#arrayLen(myArray)#"> <cfoutput>#myArray[i]#</cfoutput> </cfloop> <br/> <! --- By array ---> <cfloop index="currentIndex" array="#myArray#"> <cfoutput>#currentIndex#</cfoutput> </cfloop>
ArrayEach
ArrayEach は次のように使用できます。
<cfscript> myCities=["London","New York","Paris","Tokyo","Barcelona"]; // Create a function that takes city as an argument and prints the name of the cities as output // with delimiter as space ArrayEach(myCities,function(city){ WriteOutput("City is: " & city & "<br/>"); } ); </cfscript>
出力
City is: London
City is: New York
City is: Paris
City is: Tokyo
City is: Barcelona
配列を使用した関数型プログラミング
関数型プログラミング手法を使用すると、バグが少なくデバッグおよびテストもリファクタリングも容易なコードを作成できます。
従来の手法と比較してデータ構造をより効率的かつ容易に操作できることが、関数型プログラミングが普及してきた理由の 1 つです。
ArrayMap
ArrayMap 関数は、配列のすべての要素を操作し、変換された要素値を持つ同じ次元の配列を生成します。
次に例を示します。
<cfscript> myArray=[1,2,3,4,5] ArrayMap(myArray,function(x){ doubled[x]=x*2 // each value of the original array is doubled by the closure function }) writeDUmp(doubled) </cfscript>
出力
ArrayReduce
ArrayReduce 関数は配列を単一の値に「縮約」します。
次に例を示します。
<cfscript> data = [1,2,3,4,5,6]; sum=data.reduce(function(previous,next) { return previous+next; },0); writeOutput(sum); // Output is 21 </cfscript>
このコードを詳しく見てみましょう。reduce 関数はパラメーターとしてコールバック関数と初期値を取ります。コールバック関数はパラメーター previous および next を使用して、現在の配列要素を先行要素に追加します。関数が配列の終わりに達したら、入力配列のすべての要素の合計が出力になります。
ArrayFilter
ArrayFilter 関数は、インライン関数が true を返す配列要素をフィルタリングします。
次に例を示します。
<cfscript> myArray=[1,2,3,4,5,6,7,8,9] evenArray=ArrayFilter(myArray,function(item){ return (item mod 2==0) }) writeOutput("The array of even numbers is:") writeDump(evenArray) </cfscript>
出力
その他の配列関数
配列のコピー
単純変数(数値、文字列、ブール値、日付時刻値)の配列をコピーするには、新しい変数名に元の配列を代入します。
新しい変数に既存の配列を代入すると、ColdFusion によって配列が作成され、元の配列の内容が新しい配列にコピーされます。次の例では、まず配列を作成して 2 つの要素を挿入します。次に元の配列をコピーし、コピーした配列の要素の 1 つを変更してから、両方の配列を表示します。結果に示されるように、元の配列は変更されませんが、コピーには新しい 2 番目の要素が追加されます。
詳しくは、Duplicate を参照してください。
次に例を示します。
<cfscript> myArray[1]="First Array Element"; myArray[2]="Second Array Element"; newArray=myArray; newArray[2]="New Array Element 2"; writeDump(myArray); writeDump(newArray); </cfscript>
出力
配列の長さ
<cfscript> myArray=[1,2,3,4,5]; writeoutput(ArrayLen(myArray)); // Returns 5 </cfscript>