項目名が都道府県と県庁所在地というデータがある。
以下のデータを変数にセットしたあと、まとめて表示。
北海道、札幌
岩手、盛岡
宮城、仙台
<cfset rec = ArrayNew(1)> <cfset st = structNew()> <cfset st.tdfk = "北海道"> <cfset st.ken = "札幌"> <cfset ArrayAppend(rec, st)> <cfset st = structNew()> <cfset st.tdfk = "岩手"> <cfset st.ken = "盛岡"> <cfset ArrayAppend(rec, st)> <cfset st = structNew()> <cfset st.tdfk = "宮城"> <cfset st.ken = "仙台"> <cfset ArrayAppend(rec, st)> <cfloop index="idx" array="#rec#"> <cfoutput>#idx.tdfk#(#idx.ken#)<br></cfoutput> </cfloop>
データセット部分を以下のように書くこともできます。
<cfset rec = ArrayNew(1)> <cfset st = {tdfk="北海道", ken="札幌"}> <cfset ArrayAppend(rec, st)> <cfset st = {tdfk = "岩手", ken="盛岡"}> <cfset ArrayAppend(rec, st)> <cfset st = {tdfk = "宮城", ken="仙台"}> <cfset ArrayAppend(rec, st)>
さらに以下のようにもできます。
<cfset rec = [ {tdfk="北海道", ken="札幌"}, {tdfk = "岩手", ken="盛岡"}, {tdfk = "宮城", ken="仙台"} ]>
複合構造体は、さらに複雑なデータをまとめることもできます。
ところで、以下を実行すると意図しない表示となります。
<cfset rec = ArrayNew(1)> <cfset st.tdfk = "北海道"> <cfset st.ken = "札幌"> <cfset ArrayAppend(rec, st)> <cfset st.tdfk = "岩手"> <cfset st.ken = "盛岡"> <cfset ArrayAppend(rec, st)> <cfset st.tdfk = "宮城"> <cfset st.ken = "仙台"> <cfset ArrayAppend(rec, st)> <cfloop index="idx" array="#rec#"> <cfoutput>#idx.tdfk#(#idx.ken#)<br></cfoutput> </cfloop>
結果は以下のようになります。
宮城(仙台)
宮城(仙台)
宮城(仙台)
よく見るとStructNew()の部分がありません。
ArrayNew(1)やStructNew()を使うことによって
変数にはメモリ確保したアドレスがはいっていると考えてよいでしょう。
よって上記の場合は、
「st変数の値(アドレス)が上書きされていた」
ということになります。
「アドレス」といってもなじみがないので、
一般的には「参照」と言っているようです。
http://codezine.jp/article/detail/7333
StructNew()は使いませんが、以下の場合はOKです。
<cfset rec = ArrayNew(1)> <cfset st.tdfk = "北海道"> <cfset st.ken = "札幌"> <cfset ArrayAppend(rec, Duplicate(st))> <cfset st.tdfk = "岩手"> <cfset st.ken = "盛岡"> <cfset ArrayAppend(rec, Duplicate(st))> <cfset st.tdfk = "宮城"> <cfset st.ken = "仙台"> <cfset ArrayAppend(rec, Duplicate(st))> <cfloop index="idx" array="#rec#"> <cfoutput>#idx.tdfk#(#idx.ken#)<br></cfoutput> </cfloop> <cfabort>
Duplicate関数を使っています。
ColdFusionリファレンスによると
変数のクローン ( ディープコピー) を返します。 元の変数への参照はありません。
とのことです。