表記法
ColdFusion の構造体は、キーと値のペアで構成されます。構造体によって、互いに関連する一連の変数を 1 つの名前でグループ化することができます。ColdFusion の構造体はダイナミックに定義できます。
構造体を使用すると、関連する値を個々の値ではなく 1 つのユニットとして参照できます。例えば、従業員リストを管理する場合は、氏名、住所、電話番号、ID 番号などの個人情報を保持する構造体を作成できます。これらの情報は、個別の変数の集まりではなく、employee という構造体として参照できます。
構造体のキーは、文字列であることが必要です。キーに関連付ける値には、有効な ColdFusion 値またはオブジェクトが使用できます。文字列や整数、または配列や別の構造体などの複合オブジェクトを関連付けることができます。構造体にはあらゆる種類のデータを含めることができるので、複雑なデータを柔軟に表現できる強力なツールとして使用できます。
構造体の表記法
ColdFusion では、構造体の内容を参照するための表記法として、次の 3 つの方法がサポートされています。使用する表記法はアプリケーションの必要性に応じて選択します。
|
説明 |
---|---|
Object.property |
obj.prop でオブジェクト obj のプロパティ prop を参照できます。この表記法(ドット表記法)は、depts.John="Sales" のような単純な代入に便利です。 |
連想配列 |
キー名が事前にわからない場合や、キー名にスペース、数字、または特殊文字が含まれている場合に使用できます。この表記法では、インデックスが文字列である配列として構造体を記述します。例えば、次のようになります。 |
構造体 |
構造体表記法は、構造体を作成して初期値を設定する場合にのみ使用します。構造体のデータにアクセスしたりデータを更新したりするときには使用しません。この表記法は、代入式の右辺でのみ使用します。この表記法の形式は次のとおりです。 |
順序付き構造体のサポート
順序付き構造体
ColdFusion の構造体に対して反復処理を行う場合、キーの順序はランダムになります。ColdFusion(2016 リリース)では、キーの挿入順序を維持することができます。この挿入順序は、順序付き構造体で可能になります。
シンタックス
myStruct=StructNew("Ordered"); myStruct.first="I am number one."; myStruct["second"]="I am number two"; 次のように、リテラルシンタックスを使用して順序付き構造体を作成することもできます。 myStruct=[first:"I am number one",second="I am number two"];
順序付き構造体の使用例
<cfscript> Beatles=StructNew("Ordered"); // ColdFusion(2016 リリース)では順序付き構造体をサポート // この構造体の値を設定 Beatles.John="Vocals"; Beatles.Paul="Guitar and vocals"; Beatles.George="Lead guitar"; Beatles.Ringo="Drums"; // 構造体を反復処理して構造体の値を挿入順に // 表示 for (i in Beatles) { WriteOutput("#i#:#Beatles[i]#" & " "); } </cfscript>
出力
JOHN:Vocals PAUL:Guitar and vocals GEORGE:Lead guitar R INGO:Drums
ソート済み構造体
ColdFusion(2016 リリース)アップデート 3 では、ソート済み構造体をサポートしています。構造体でソート順序を維持することができます。ソートを行う場合、実行時に毎回ソートを行うのではなく、ソート順序が維持されます。
ソート済み構造体の使用例
<cfscript> // ソートタイプをテキスト、ソート順序を降順とする順序付きタイプの構造体を作成someStruct=StructNew("ordered","text","desc",false); someStruct.google = "search"; someStruct.microsoft= "windows"; someStruct.apple = "mac"; someStruct.amazon = "shopping"; for (i in someStruct){ WriteOutput(#i# & "|"); } </cfscript>
出力
MICROSOFT|GOOGLE|APPLE|AMAZON|
コールバック関数を使用した構造体内でのソート
<cfscript> sorted = structNew("ordered", function(e1,e3,e2,e4) { return compare(e1,e2); }); sorted.azure = "blue"; sorted.adze = "tool"; sorted.baffle = 01; sorted.adamantium = "dork"; sorted.alabama = 3; sorted.ballad = 007; sorted.age = 36; sorted.aabc= "allardyce"; sorted.baleful="hodgson"; sorted.aardvark=-7; sorted.back="sort"; writedump(sorted); </cfscript>
複合構造体の参照
構造体の中に別の構造体が含まれている場合は、object.property 表記法または連想配列表記法を拡張することで、ネストされた構造体のデータを参照できます。両方の表記法を組み合わせて使用することもできます。
例えば、構造体 structure1 にキー key1 があり、その値が struct2key1、struct2key2... というキーを持つ構造体である場合は、次の参照方法のいずれを使用しても、key1 の構造体の最初のキーのデータにアクセスできます。
Structure1.key1.Struct2key1 Structure1["key1"].Struct2key1 Structure1.key1["Struct2key1"] Structure1["key1"]["Struct2key1"]
次の例に、複合構造体の内容を参照する様々な方法を示します。
<cfscript> myArray=ArrayNew(1); myArray[1]="2"; myArray[2]="3"; myStruct2=StructNew(); myStruct2.struct2key1="4"; myStruct2.struct2key2="5"; myStruct=StructNew(); myStruct.key1="1"; myStruct.key2=myArray; myStruct.key3=myStruct2; writeDump( var=myStruct ); key1Var="key1"; key2Var="key2"; key3Var="key3"; var2="2"; writeOutput("Value of the first key #mystruct.key1# #mystruct[""key1""]# #mystruct[key1Var]# Value of the second entry in the key2 array #myStruct.key2[2]# #myStruct[""key2""][2]# #myStruct[key2Var][2]# #myStruct[key2Var][var2]# Value of the struct2key2 entry in the key3 structure #myStruct.key3.struct2key2# #myStruct[""key3""][""struct2key2""]# #myStruct[key3Var][""struct2key2""]# #myStruct.key3[""struct2key2""]# #myStruct[""key3""].struct2key2#"); </cfscript>
コードの説明
このコードについて、次の表で説明します。
コード |
説明 |
---|---|
<cfscript> myArray = ArrayNew (1); myArray[1]="2"; myArray[2]="3"; myStruct2=StructNew(); myStruct2.struct2key1="4"; myStruct2.struct2key2="5"; myStruct=StructNew(); myStruct.key1="1"; myStruct.key2=myArray; myStruct.key3=myStruct2; </cfscript> |
3 つのエントリ(文字列、配列、埋め込み構造体)を持つ構造体を作成します。 |
writeDump( var=myStruct ); |
構造体全体を表示します。 |
key1Var="key1"; key2Var=""key2; key3Var="key3"; |
myStruct の各キーの名前および数字 2 を値として持つ変数を作成します。 |
<cfoutput> |
次の表記法を使用して、key1(文字列)エントリの値を出力します。
|
<br> |
次の表記法を使用して、key2(配列)の 2 番目のエントリの値を出力します。
|
Value of the struct2key2 entry in the key3 structure<br> |
次の表記法を使用して、key3(埋め込み構造体)の 2 番目のエントリの値を出力します。
|