Employee
構造体の作成
ColdFusion での構造体の作成方法には、明示的な方法と暗黙的な方法の 2 通りがあります。明示的な方法では、関数を使用して構造体を作成し、代入ステートメントまたは関数を使用してデータを設定します。暗黙的な方法では、代入ステートメントを使用します。
関数による構造体の作成
次のように、StructNew 関数を使用して構造体に変数名を割り当てることで、構造体を作成できます。
<cfscript> structName=StructNew(); </cfscript>
例えば、departments という構造体を作成するには、次のシンタックスを使用します。
<cfscript> departments=StructNew(); </cfscript>
このステートメントによって空の構造体が作成されるので、データを追加できます。
順序付き構造体のサポート
ColdFusion の 2016 リリースでは、挿入順序を維持した構造体を作成できます。
StructNew("Ordered") を使用して構造体を反復処理すると、キーは挿入順序に従って取得されます。
次に例を示します。
<cfscript> departments = structNew("Ordered"); /** On iterating this struct, you get the values in insertion order, which is the way you inserted the values. **/ /** Create a structure and set its contents. **/ departments.John = "Sales"; departments.Tom = "Finance"; departments.Mike = "Education"; departments.Andrew = "Marketing"; /** Build a table to display the contents **/ writeOutput("<table cellpadding=""2"" cellspacing=""2""> <tr> <td><b>Employee</b></td> <td><b>Department</b></td> </tr>"); // Use cfloop to loop through the departments structure.The item attribute specifies a name for the structure key. for ( person in departments ) { writeOutput("<tr> <td>#person#</td> <td>#Departments[person]#</td> </tr>"); } writeOutput("</table>"); </cfscript>
このコードの出力は次のようになります。
|
Department |
---|---|
John |
Sales |
Tom |
Finance |
Mike |
Education |
Andrew |
Marketing |
構造体の暗黙的な作成
ColdFusion の 2016 リリースでは、次の例に示すように、空の順序付き構造体を暗黙に作成できます。
<cfset myStruct = [:]> または <cfset myStruct = [=]>
次の例は、リテラルシンタックスから構造体を作成する方法を示しています。
departments = [Marketing = "John", Sales : [Executive : "Tom", Assistant = "Mike"]];
空の構造体を暗黙的に作成するには、次の例のようにします。
<cfscript> myStruct = {}; </cfscript>
変数にデータを代入することによって構造体を作成できます。例えば、次の各行では、myStruct という名前の構造体が作成されます。この構造体は 1 つの要素 name を持ち、その値は Adobe Systems Incorporated です。
<cfscript> coInfo=StructNew(); coInfo.name="Adobe Systems Incorporated"; coInfo["name"]="Adobe Systems Incorporated"; coInfo={name="Adobe Systems Incorporated"}; </cfscript>
3 番目の例のように構造体表記法を使用して構造体を作成する場合は、複数の構造体フィールドを作成できます。その例を次に示します。
<cfscript> coInfo={name="Adobe Systems Incorporated" industry="software"}; </cfscript>
暗黙的な作成をおこなうときは、構造体をネストしたり、配列をネストしたり、構造体と配列をネストしたりすることができます。次に例を示します。
<cfscript> myStruct = {structKey1 = {innerStructKey1 = "innerStructValue1"}}; </cfscript>
構造体表記法の内部で、代入式の左辺に object .property の表記法を使用することができます。次に例を示します。
<cfscript> myStruct={structKey1.innerStructKey1 = "innerStructValue1"}; </cfscript>
次のような複数のステートメントを使用することもできます。
<cfscript> innerStruct1 = {innerStructKey1 = "innerStructValue1"}; myStruct1={structKey1 = innerStruct1}; </cfscript>
構造体を暗黙的に作成する場合、ダイナミック変数は使用できません。例えば、次の式ではエラーが発生します。
<cfscript> i="coInfo"; "#i#"={name = "Adobe Systems Incorporated"}; </cfscript>
関数およびタグにおける暗黙的に作成された構造体の使用
暗黙的に作成された構造体は、関数(ユーザー定義関数を含む)やタグの中で直接使用できます。例えば、次のコードを実行すると、暗黙的に作成された構造体がダンプされます。
<cfscript> writeDump( var={Name ="28 Weeks Later", Time = "7:45 PM"} ); </cfscript>
次の例に示すように、構造体表記法の内部では配列表記法を使用できます。
<cfscript> student = {firstName="Jane", lastName="Janes", grades=[91, 78, 87]}; </cfscript>
構造体要素の追加と更新
構造体に要素を追加したり、構造体の要素を更新したりするには、要素に値を代入するか、または ColdFusion 関数を使用します。直接代入するほうがシンプルで効率的です。
構造体にキーと値のペアを追加するには、次の例のように構造体キーの値を定義します。
<cfscript> myStruct=StructNew(); myStruct.key1="A new structure with a new key"; WriteDump(myStruct); myStruct.key2="Now I've added a second key"; WriteDump(myStruct); </cfscript>
次のコードでは、cfset と object.property 表記法を使用して、departments.John という構造体要素を作成し、John の部門を Sales から Marketing に変更しています。さらに、連想配列表記法を使用して、部門を Facilities に変更しています。部門を変更するたびに、その結果を表示しています。
<cfscript> departments=structnew(); departments.John = "Sales"; writeOutput("Before the first change, John was in the #departments.John# Department"); Departments.John = "Marketing"; writeOutput("After the first change, John is in the #departments.John# Department"); Departments["John"] = "Facilities"; writeOutput("After the second change, John is in the #departments.John# Department"); </cfscript>
構造体とキーに関する情報の取得
構造体やキーに関する情報を取得するには、ColdFusion 関数を使用します。
構造体に関する情報の取得
値が構造体であるかどうかを調べるには、次のように IsStruct 関数を使用します。
IsStruct(variable)
この関数は、変数 variable が ColdFusion 構造体である場合に True を返します。variable が java.util.Map インターフェイスを実装する Java オブジェクトである場合も、True を返します。
構造体のインデックスは数値ではないので、構造体に存在する名前と値のペアの数を調べるには、次の例のように、StructCount 関数を使用します。
StructCount(employee)
特定の構造体がデータを含んでいるかどうかを調べるには、次のように、StructIsEmpty 関数を使用します。
StructIsEmpty(structure_name)
構造体が空の場合は True を返し、データを含んでいる場合は False を返します。
特定のキーとその値の検索
構造体に特定のキーが存在するかどうかを調べるには、次のように、StructKeyExists 関数を使用します。
StructKeyExists(structure_name, "key_name")
構造体名は引用符で囲みません。キー名は二重引用符(")で囲みます。
if ( StructKeyExists(myStruct, "myKey") ) { cfoutput( ) { writeOutput("#mystruct.myKey#"); } }
StructKeyExists 関数で、キー名を変数で表すことによって、キーを動的にテストできます。この場合は、変数を引用符で囲みません。例えば次のコードでは、GetEmployees クエリのレコードをループして、クエリの LastName フィールドに一致するキーが myStruct 構造体に存在するかどうかをテストします。一致するキーが検出された場合は、クエリの LastName とそれに対応する構造体のエントリが表示されます。
<cfloop query="GetEmployees"> <cfif StructKeyExists(myStruct, LastName)> <cfoutput>#LastName#: #mystruct[LastName]#</cfoutput><br> </cfif> </cfloop>
キーの名前が事前にわかっている場合は、次の例のように、ColdFusion の IsDefined 関数を使用できます。
IsDefined("structure_name.key")>
キーが動的である場合や、キーに特殊文字が含まれている場合は、StructKeyExists 関数を使用します。
構造体エントリが存在するかどうかをテストするときは、IsDefined を使用するよりも、StructKeyExists を使用するほうが効率的です。ColdFusion のスコープは構造体として使用できるので、変数の存在を確認するときに StructKeyExists を使用すれば、効率を向上させることができます。
構造体のキーのリストの取得
CFML 構造体のキーのリストを取得するには、次のように StructKeyList 関数を使用します。
<cfscript> temp=StructKeyList(structure_name, [delimiter]); </cfscript>
StructKeyList の使用例
<cfscript> myStruct=StructNew(); myStruct.key1="Bugatti"; myStruct.key2="Lamborghini"; myStruct.key3="Maserati"; myStruct.key4="Ferrari"; myStruct.key5="Aprilia"; myStruct.key5="Ducati"; WriteOutput("The input struct is:"); WriteDump(myStruct); WriteOutput("struct has " & StructCount(myStruct) & " keys: " & StructKeyList(myStruct) & "<br/>"); </cfscript>
区切り文字には任意の文字を指定できます。デフォルトはカンマです。
構造体のキーの配列を取得する場合は、次のように StructKeyArray 関数を使用します。
<cfscript> temp=StructKeyArray(structure_name); </cfscript>
構造体のコピー
ColdFusion には、構造体をコピーしたり、構造体の参照を作成したりする方法がいくつか用意されています。次の表に、それらの方法と用途を示します。
方法 |
用途 |
---|---|
Duplicate 関数 |
構造体の完全なコピーを作成します。構造体、クエリ、その他のオブジェクトなど、すべてのデータを元の構造体から新しい構造体にコピーします。したがって、構造体のコピーを変更しても、他の構造体には影響を与えません。ここの関数は、構造体を新しいスコープに完全に移動する場合に便利です。特に、Application などのロックする必要があるスコープに構造体が作成されている場合は、Request などのロックする必要がないスコープに複製してから、ロックが必要なスコープの構造体を削除できます。 |
StructCopy 関数 |
構造体のシャローコピーを作成します。構造体を作成し、元の構造体の最上位にあるすべての単純変数と配列の値を新しい構造体にコピーします。ただし、元の構造体に含まれている構造体、クエリ、その他のオブジェクト、またはこれらのオブジェクトの中のデータはコピーされません。この場合は、元の構造体内のオブジェクトへの参照が新しい構造体に作成されます。したがって、元の構造体でこれらのオブジェクトを変更すると、コピーされた構造体の対応するオブジェクトも変更されます。ほとんどの場合、この関数の代わりに Duplicate 関数を使用できます。 |
変数への代入 |
構造体への参照(エイリアス)を作成します。ある変数名を使用してデータを変更した場合、別の名前でその構造体を参照している変数でもデータが変更されます。この方法は、ローカル変数を別のスコープに追加する場合や、元のスコープから変数を削除せずに変数のスコープを変更する場合に便利です。 |
構造体のコピー
<cfscript> myStruct = StructNew(); myNewStruct = StructNew(); myStruct.key1 = "The quick brown fox"; myStruct.key2 = "jumped over the"; myStruct.key3 = "lazy dog"; myNewStruct.k1 = "Atlantic"; myNewStruct.k2 = "Pacific"; myNewStruct.k3 = "Indian"; myArray[1]="North Island"; myArray[2]="South Island"; myStruct.key4 = myNewStruct; // Assign myArray as a key to myNewStruct myNewStruct.k4=myArray; // Print myStruct WriteOutput("The original struct is:"); WriteDump(myStruct); // Copy the structure myStruct into a structure called copiedStruct copiedStruct=StructCopy(myStruct); // Print copiedStruct WriteOutput("The copied struct is:"); WriteDump(copiedStruct); </cfscript>
構造体の複製
<cfscript> myStruct = StructNew(); myNewStruct = StructNew(); myStruct.key1 = "The quick brown fox"; myStruct.key2 = "jumped over the"; myStruct.key3 = "lazy dog"; myNewStruct.k1 = "Atlantic"; myNewStruct.k2 = "Pacific"; myNewStruct.k3 = "Indian"; myArray[1]="North Island"; myArray[2]="South Island"; myStruct.key4 = myNewStruct; // Assign myArray as a key to myNewStruct myNewStruct.k4=myArray; // Print myStruct WriteOutput("The original struct is:"); WriteDump(myStruct); // copy the structure myStruct into a structure called copiedStruct copiedStruct=StructCopy(myStruct); // Change copiedStruct properties copiedStruct.n1="Alien"; copiedStruct.n2="Predator"; copiedStruct.n3="Terminator"; // Create a new struct anotherStruct anotherStruct=StructNew(); anotherStruct.t1="Amazon"; anotherStruct.t2="Nile"; anotherStruct.t3="Danube"; // Assign anotherStruct as a new key to copiedStruct copiedStruct.n4=anotherStruct; // Print copiedStruct WriteOutput("The changed struct,copiedStruct, is:"); WriteDump(copiedStruct); // Create a duplicate version of copiedStruct cloneStruct=Duplicate(copiedStruct); // Print cloneStruct WriteOutput("The new duplicate struct is:"); WriteDump(cloneStruct); </cfscript>
構造体要素および構造体の削除
構造体からキーとその値を削除するには、次のように、StructDelete 関数を使用します。
StructDelete(structure_name, key [, indicateNotExisting ])
StructDelete の使用例
<cfscript> myStruct=StructNew(); myStruct.item1="JPG"; myStruct.item2="BMP"; myStruct.item3="PNG"; // Print myStruct WriteOutput("The input struct is:"); WriteDump(myStruct); // Delete key "item1" from myStruct StructDelete(myStruct,"item1"); // Print updated myStruct WriteOutput("The modified struct is:"); WriteDump(myStruct); </cfscript>
indicateNotExisting 引数は、指定されたキーが存在しない場合の処理を指定します。この関数は、デフォルトでは常に True を返します。ただし、indicateNotExisting 引数に True が指定されている場合は、キーが存在するときは True を返し、キーが存在しないときは False を返します。
StructClear 関数を使用すると、構造体のインスタンスを保持したまま構造体内のすべてのデータを削除できます。
StructClear(structure_name)
StructCopy 関数を使用してコピーした構造体を StructClear 関数を使用して削除すると、指定された構造体は削除されますが、コピーには影響を与えません。
次の例のように、複数の参照を持つ構造体を StructClear で削除すると、その構造体の内容が削除され、すべての参照が空の構造体を指します。
StructClear の使用例
<cfscript> myStruct=StructNew(); myStruct.item1="JPG"; myStruct.item2="BMP"; myStruct.item3="PNG"; // Print myStruct WriteOutput("The input struct is:"); WriteDump(myStruct); // Create another struct myAnotherStruct=StructNew(); // Copy myStruct to a new structure myAnotherStruct=StructCopy(myStruct); // Print myAnotherStruct WriteOutput("The copied struct is:"); WriteDump(myAnotherStruct); // Delete the structure myAnotherStruct StructClear(myAnotherStruct); // Print myAnotherStruct after deletion WriteOutput("The deleted struct is:"); WriteDump(myAnotherStruct); </cfscript>
構造体の反復処理
次の例のように、構造体を反復処理することでその内容を出力できます。
<cfscript> myStruct=StructNew(); myStruct.name1="Jeb"; myStruct.name2="Bernie"; myStruct.name3="Hillary"; myStruct.name4="Donald"; for ( i in StructSort(myStruct) ) { cfoutput( ) { writeOutput("#myStruct[i]#"); } } </cfscript>
数値ソートの実行
数値ソートを実行するには、次に示すように、sortType 属性を "numeric" に設定します。
<cfscript> myStruct=StructNew(); myStruct.number1=75; myStruct.number2=1112; myStruct.number3=-674; myStruct.number4=12; myStruct.number5=3456; myStruct.number6=-342; myStruct.number7=3.14; for ( i in StructSort(myStruct,"numeric") ) { cfoutput( ) { writeOutput("#myStruct[i]#"); } } </cfscript>
コミュニティから投稿されたヘルプ情報
その他の有効なステートメント
<cfscript> i = "coInfo"; myStruct = {structKey1 = {innerStructKey1 = "innerStructValue1"}}; myStruct={structKey1.innerStructKey1 = "innerStructValue1"}; "#i#"={name = "Adobe Systems Incorporated"}; //you can also use a colon writeOutput("You can also use a colon:"); myStruct={structKey1.innerStructKey1 : "innerStructValue1"}; </cfscript>
大文字と小文字を区別する構造体
構造体は、CFML の欠くことのできない要素です。構造体を使用すると、複雑なオブジェクトを定義して、そのオブジェクトを様々な操作に使用することができます。
ColdFusion の構造体には次のタイプがあります。
- 通常の構造体
- 順序付き構造体
ColdFusion(2021 リリース)では、大文字と小文字の区別に関する問題を回避するために、構造体のキーを維持することができます。
以前のバージョンでは、ColdFusion Administrator の「シリアル化用の構造体キーで大文字小文字を保持」オプションを有効にする必要がありました。
ColdFusion(2021 リリース)でコーディングする際には、大文字と小文字を区別する構造体を使用できます。これにより、構造体キーの大文字と小文字の区別が自動的に維持されます。
詳しくは、構造体の作成を参照してください。
大文字と小文字を区別する構造体
シンタックス
mystruct = StructNew("casesensitive")
例
<cfscript> animals=StructNew("casesensitive") animals.Aardwolf="Proteles cristata" animals.aardvark="Orycteropus afer" animals.Alligator="Mississippiensis" animals.albatross="Diomedeidae" writeDump(animals) </cfscript>
暗黙の表記法
シンタックス
mystruct=${ "key1":"val1", "key":"val2" }
例
<cfscript> animals=${ Aardwolf:"Proteles cristata", aardvark:"Orycteropus afer", alligator:"Mississippiensis", Albatross:"Diomedeidae" } writeDump(animals) </cfscript>
出力
大文字と小文字を区別する順序付き構造体
シンタックス
mystruct = StructNew("ordered-casesensitive")
例
<cfscript> animals=StructNew("ordered-casesensitive") animals.Aardwolf="Proteles cristata" animals.aardvark="Orycteropus afer" animals.alligator="Mississippiensis" animals.Albatross="Diomedeidae" writeDump(animals) </cfscript>
暗黙の表記法
シンタックス
mystruct=$[ "key1":"val1", "key2":"val2" ]
例
<cfscript> animals=$[ aardwolf:"Proteles cristata", aardvark:"Orycteropus afer", alligator:"Mississippiensis", albatross:"Diomedeidae" ] writeDump(animals) writeDump(animals.getMetadata()) </cfscript>
出力
2 つの構造体の結合
暗黙の表記法を使用して 2 つの構造体オブジェクトを容易に結合できます。また、結合した構造体でキーを上書きできます。
例
<cfscript> obj1 =${ key1: 'val1', x: 25 }; obj2 =${ key2: 'val2', y: 50 }; mergedObj = $[obj1, obj2, "key3":"val3",z:75] writeDump(mergedObj); </cfscript>
出力
キーの上書き
<cfscript> obj1 ={ foo: 'bar', x: 42 }; obj2 ={ foo: 'baz', y: 13 }; mergedObj = {...obj1, ...obj2, "key1":"23"}; writeDump(mergedObj); </cfscript>
出力
非構造化代入
ColdFusion では、非構造化代入シンタックスにより、配列や構造体の値を別個の変数に代入できます。
このシンタックスの外見は、配列リテラルやオブジェクトリテラルと似ています。
シンタックス
({key1, key2, ............, keyN} = {key1:value1, key2:value2, , keyN:valueN})
上記のステートメントを使用すると、左辺にあるすべての変数に 1 行のシンタックスで右辺の値を代入できます。
上記の行は、ColdFusion で次のコードを記述する場合と同じです。
variable1=value1
または
key1=value1
例えば、従来の代入方法を使用すると、次のようなコードを記述できます。
<cfscript> val1=10 val2=20 writeOutput(val1) writeOutput(val2) </cfscript>
非構造化代入を使用すると、上記のコードは次のように書き換えることができます。
<cfscript> [val1,val2]=[10,20] writeOutput(val1) writeOutput(val2) </cfscript>
ColdFusion タグでは非構造化もサポートしています。例えば、次のように入力します。
<cfset [foo, [[bar], baz]] = [61,[[42], 23]]> <cfoutput>#bar#</cfoutput> <cfoutput>#baz#</cfoutput>
非構造化の種類
構造体の非構造化
構造体の非構造化では、オブジェクトプロパティを値として使用して新しい変数を作成できます。
次に例を示します。
<cfscript> person = { name: 'John Doe', age: 25, location: { country: 'Canada', city: 'Vancouver', coordinates: [49.2827, -123.1207] } }; ({name, location: {country, city, coordinates: [lat, lng]},age=40} = person) </cfscript>
例 2
ネストされたオブジェクトの非構造化
<cfscript> person = { name: 'John Doe', age: 25, location: { country: 'Canada', city: 'Vancouver', coordinates: [49.2827, -123.1207] } }; ({name, location: {country, city, coordinates: [lat, lng]},age} = person) writeoutput(name & "<br>"); writeoutput(city & "<br>") writeoutput(lat & "<br>"); writeoutput(lng & "<br>"); writeoutput(country & "<br>"); writeoutput(age) </cfscript>
プロパティの簡易表記
プロパティとして渡された変数と同じ名前のキーを持つオブジェクトを定義する場合は、簡易表記を使用して、単にキー名を渡すことができます。
このシンタックスを使用すると、複雑な構造体をすっきりと定義することができます。
例 1
<cfscript> a = 'foo'; b = 2021; c = {}; o = {a, b, c} writeOutput((o.a === 'foo')); writeOutput((o.b === 2021)); writeDump((o.c)); </cfscript>
出力
YESYES
<cfscript> CF9 = 'Centaur' CF10 = 'Zeus' CF11 = 'Splendor' CF2016 = 'Raijin' CF2018 = 'Aether' CF2021 = 'Project Stratus' CFReleaseCodeNames = ${ CF9, CF10, CF11, CF2016, CF2018, CF2021 } writeDump(CFReleaseCodeNames); </cfscript>
出力