coldfusion
CFLOOPハウツー
サーチ…
備考
大きなおかげで
- Pete Freitag氏のCFScriptチートシート
- Adam Cameron for CF 11:CFScriptのCFLOOPは非常に壊れています (それはまだCF 2016にあります)。
CFMLタグを使用してコレクションをループします。
<!--- Define collection --->
<cfset attributes = {
"name": "Sales",
"type": "text",
"value": "Connection"
}>
<!---
cfloop tag with attribute collection can be used to
loop through the elements of a structure
--->
<cfloop collection=#attributes# item="attribute">
<cfoutput>
Key : #attribute#, Value : #attributes[attribute]#
</cfoutput>
</cfloop>
CFSCRIPTを使用してコレクションをループします。
<cfscript>
/*define collection*/
attributes = {
"name": "Sales",
"type": "text",
"value": "Connection"
};
for(attribute in attributes){
/* attribute variable will contain the key name of each key value pair in loop */
WriteOutput('Key : ' & attribute & ', Value : ' & attributes[attribute] & '<br/>');
}
</cfscript>
インデックス
パラメーター
| 属性 | 必須 | タイプ | デフォルト | 説明 |
|---|---|---|---|---|
| 索引 | 真実 | 文字列 | ループのインデックスの変数名。デフォルトはvariablesスコープです。 | |
| から | 真実 | 数値 | インデックスの開始値。 | |
| に | 真実 | 数値 | インデックスの終了値。 | |
| ステップ | 偽 | 数値 | 1 | 反復ごとにインデックスを増減する値。 |
基本索引ループ
x最終値は10です。
<!--- Tags --->
<cfoutput>
<cfloop index="x" from="1" to="10">
<li>#x#</li>
</cfloop>
</cfoutput>
<!--- cfscript --->
<cfscript>
for (x = 1; x <= 10; x++) {
writeOutput('<li>' & x & '</li>');
}
</cfscript>
<!--- HTML Output --->
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
ステップを2に増やす
x最終値は11です。
<!--- Tags --->
<cfoutput>
<cfloop index="x" from="1" to="10" step="2">
<li>#x#</li>
</cfloop>
</cfoutput>
<!--- cfscript --->
<cfscript>
for (x = 1; x <= 10; x += 2) {
writeOutput('<li>' & x & '</li>');
}
</cfscript>
<!--- HTML Output --->
- 1
- 3
- 5
- 7
- 9
1ずつ減る
x最終値は0です。
<!--- Tags --->
<cfoutput>
<cfloop index="x" from="10" to="1" step="-1">
<li>#x#</li>
</cfloop>
</cfoutput>
<!--- cfscript --->
<cfscript>
for (x = 10; x > 0; x--) {
writeOutput('<li>' & x & '</li>');
}
</cfscript>
<!--- HTML Output --->
- 10
- 9
- 8
- 7
- 6
- 5
- 4
- 3
- 2
- 1
関数内のCFLoop
関数内のインデックスの
varまたはlocalスコープを確認してください。Foo()は11を返します。
<!--- var scope --->
<cffunction name="foo" access="public" output="false" returntype="numeric">
<cfset var x = 0 />
<cfloop index="x" from="1" to="10" step="1">
<cfset x++ />
</cfloop>
<cfreturn x />
</cffunction>
<!--- Local scope --->
<cffunction name="foo" access="public" output="false" returntype="numeric">
<cfloop index="local.x" from="1" to="10" step="1">
<cfset local.x++ />
</cfloop>
<cfreturn local.x />
</cffunction>
現在のColdFusion 11から
cfscript関数
cfloopは、スタンドアローンカウンタメカニズムとしてのindexをサポートしていません。
調子
タグ構文
パラメーター
| 属性 | 必須 | タイプ | デフォルト | 説明 |
|---|---|---|---|---|
| 調子 | 真実 | 文字列 | ループを管理する条件。 < 、 > 、 =などの数式記号は使用できません。同様に、ColdFusionのテキストの実装を使用しなければならないless than 、 lt 、 greater than 、 gt 、 equals又はeq 。 |
x最終値は5です。
<cfset x = 0 />
<cfoutput>
<cfloop condition="x LT 5">
<cfset x++ />
<li>#x#</li>
</cfloop>
</cfoutput>
生成されたHTML
これは、HTMLの各行の間に改行もあります。
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
CFScript
ColdFusion 8以前
<cfscript>
x = 0;
while (x LT 5) {
x = x + 1;
writeOutput('<li>' & x & '</li>');
}
</cfscript>
現在のColdFusion 8から
<cfscript>
x = 0;
while (x LT 5) {
x = x++;
writeOutput('<li>' & x & '</li>');
}
</cfscript>
現在のColdFusion 11から
cfscript関数
cfloopはconditionサポートしていません。
生成されたHTML
cfscriptの出力はすべて1行にあることに注意してください。
<li>one</li><li>two</li><li>three</li><li>four</li>
日付または時間範囲
日付または時間範囲の例
クエリ
city 、 statecode 、およびzipcode列を含み、80,000を超えるレコードを持つテーブルdbo.state_zip考えてみましょう。
パラメーター
| 属性 | 必須 | タイプ | デフォルト | 説明 |
|---|---|---|---|---|
| クエリ | 真実 | 文字列 | クエリオブジェクトの変数名。 | |
| スタートロー | 偽 | 数値 | クエリオブジェクトの開始行インデックス。 | |
| エンドロー | 偽 | 数値 | クエリオブジェクトの終了行インデックス。 | |
| グループ | 偽 | 文字列 | レコードをグループ化するためのクエリ列名。 |
クエリの例
<cfquery name="geo" datasource="reotrans-dev">
SELECT city, stateCode, zipCode
FROM dbo.state_zip
</cfquery>
タグ構文
cfloopのソースとしてクエリオブジェクトgeoを使用する。テーブルdbo.state_zipは非常に多くのレコードがあるため、生成されるHTMLにはかなりの時間がかかります。この例では、最初の20レコード分のHTMLのみを示しています。
<cfoutput>
<ul>
<cfloop query="geo">
<!--- Scope the column names with the query name. --->
<li>#geo.city# | #geo.stateCode# | #geo.zipCode#</li>
</cfloop>
</ul>
</cfoutput>
生成されたHTML
<ul>
<li>100 PALMS | CA | 92274</li>
<li>1000 PALMS | CA | 92276</li>
<li>12 MILE | IN | 46988</li>
<li>1ST NATIONAL BANK OF OMAHA | NE | 68197</li>
<li>29 PALMS | CA | 92277</li>
<li>29 PALMS | CA | 92278</li>
<li>3 STATE FARM PLAZA | IL | 61710</li>
<li>3 STATE FARM PLAZA | IL | 61791</li>
<li>30TH STREET | PA | 19104</li>
<li>3M CORP | MN | 55144</li>
<li>65TH INFANTRY | PR | 00923</li>
<li>65TH INFANTRY | PR | 00924</li>
<li>65TH INFANTRY | PR | 00929</li>
<li>65TH INFANTRY | PR | 00936</li>
<li>7 CORNERS | VA | 22044</li>
<li>88 | KY | 42130</li>
<li>9 MILE POINT | LA | 70094</li>
<li>A A R P INS | PA | 19187</li>
<li>A A R P PHARMACY | CT | 06167</li>
<li>A H MCCOY FEDERAL BLDG | MS | 39269</li>
</ul>
出力を特定の行に制限する
クエリの出力を特定の行範囲に制限するには、 startrowとendrow指定します。
<cfloop query="geo" startrow="100" endrow="150">
<li>#geo.city# | #geo.stateCode# | #geo.zipCode#</li>
</cfloop>
出力のグループ化
この例のデータでは、各状態に関連付けられている複数の都市に対して複数の同じ状態がリストされています。また、各都市に関連付けられている複数の郵便番号との関係で、同じ都市を複数回表示することもできます。
最初に出力を状態別にグループ化しましょう。 stateCodeグループ化されたコンテンツの下に出力されるコンテンツの周りにstateCodeれたcfloopの2番目のインスタンスに注目してください。
<cfoutput>
<ul>
<cfloop query="geo" group="stateCode">
<!--- Scope the column names with the query name. --->
<li>#geo.stateCode#
<ul>
<cfloop>
<li>#geo.city# | #geo.zipCode#</li>
</cfloop>
</ul>
</li>
</cfloop>
</ul>
</cfoutput>
グループ化されたcfloopタグからHTML(抽出)を生成します。
<ul>
<li>AK
<ul>
<li>KONGIGANAK | 99545</li>
<li>ADAK | 99546</li>
<li>ATKA | 99547</li>
<!-- etc. -->
</ul>
</li>
<li>AL
<ul>
<li>ALEX CITY | 35010</li>
<li>ALEXANDER CITY | 35010</li>
<li>ALEX CITY | 35011</li>
<!-- etc. -->
</ul>
</li>
<!-- etc. -->
</ul>
最後にcityごとにすべてのzipCodeエントリを表示するためにstateCode 、次にcity stateCodeの出力をグループ化しましょう。 2番目のcfloopがcity別にグループ化され、3番目のcfloopが存在し、 zipCodeデータを出力することに注意してください。
<cfoutput>
<ul>
<cfloop query="geo" group="stateCode">
<li>#geo.stateCode#
<ul>
<cfloop group="city">
<li>#geo.city#
<ul>
<cfloop>
<li>#geo.zipCode#</li>
</cfloop>
</ul>
</li>
</cfloop>
</ul>
</li>
</cfloop>
</ul>
</cfoutput>
グループ化された2つのcfloopタグからHTML(抽出)を生成します。
<ul>
<li>AK
<ul>
<li>ADAK
<ul>
<li>99546</li>
<li>99571</li>
</ul>
</li>
<li>AKHIOK
<ul>
<li>99615</li>
</ul>
</li>
<!--- etc. --->
<li>BARROW
<ul>
<li>99723</li>
<li>99759</li>
<li>99789</li>
<li>99791</li>
</ul>
</li>
<!--- etc. --->
</ul>
</li>
<!--- stateCodes etc. --->
</ul>
CFScript
ColdFusion 6(MX)現在のところ
<cfscript>
for (x = 1; x LTE geo.recordcount; x = x + 1) {
writeOutput( '<li>' & geo.city[x] & ' | ' &
geo.stateCode[x] & ' | ' & geo.zipCode[x] & '</li>');
}
</cfscript>
ColdFusion 8現在のところ
<cfscript>
for (x = 1; x <= geo.recordcount; x++) {
writeOutput( '<li>' & geo.city[x] & ' | ' &
geo.stateCode[x] & ' | ' & geo.zipCode[x] & '</li>');
}
</cfscript>
ColdFusion 10現在のところ
FOR IN構文では、xは行インデックスではなくクエリ行オブジェクトです。
<cfscript>
for (x in geo) {
writeOutput( '<li>' & x.city & ' | ' &
x.stateCode & ' | ' & x.zipCode & '</li>');
}
</cfscript>
現在でもColdFusion 11
ColdFusion 11では、ほとんどのタグをcfscriptとして書き込むことができます。
<cfscript>
cfloop(query: geo, startrow: 1, endrow: 2) {
writeOutput( '<li>' & geo.city & ' | ' &
geo.stateCode & ' | ' & geo.zipCode & '</li>');
}
</cfscript>
group
<cfscript>
cfloop(query: geo, group: 'city') {
writeOutput( '<li>' & geo.city & '<ul>');
cfloop() { // no arguments, just as in the tag syntax.
writeOutput('<li>' & geo.zipCode & '</li>');
}
writeOutput('</ul></li>');
}
</cfscript>
リスト
このリストを考えてみましょう:
<cfset foo = "one,two,three,four" />
タグ構文
パラメーター
| 属性 | 必須 | デフォルト | 説明 |
|---|---|---|---|
| リスト | 真実 | リストオブジェクト。変数は評価されなければならない(##でラップされる) | |
| 索引 | 真実 | リストの現在の要素。 |
<cfoutput>
<cfloop list="#foo#" index="x">
<li>#x#</li>
</cfloop>
</cfoutput>
生成されたHTML
これは、HTMLの各行の間に改行もあります。
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
CFScript
ColdFusion 8以前
<cfscript>
for (x = 1; x LTE listLen(foo); x = x + 1) {
writeOutput("<li>" & listGetAt(foo, x) & "</li>");
}
</cfscript>
現在のColdFusion 8から
<cfscript>
for (x = 1; x <= listLen(foo); x++) {
writeOutput("<li>" & listGetAt(foo, x) & "</li>");
}
</cfscript>
現在のColdFusion 9から
<cfscript>
for (x in foo) {
writeOutput("<li>" & x & "</li>");
}
</cfscript>
現在のColdFusion 11から
cfscript関数
cfloopはlistサポートしていません。
生成されたHTML
cfscriptの出力はすべて1行にあることに注意してください。
<li>one</li><li>two</li><li>three</li><li>four</li>
アレイ
ColdFusion 8では、
cflooparrayオブジェクトを直接使用する機能が追加されました。
この配列を考えてみましょう。
<cfset aFoo = [
"one"
, "two"
, "three"
, "four"
] />
タグ構文
現在のColdFusion 8から
属性indexを単独で使用する。
パラメーター
| 属性 | 必須 | デフォルト | 説明 |
|---|---|---|---|
| アレイ | 真実 | 配列オブジェクト。変数は評価されなければならない(##でラップされる) | |
| 索引 | 真実 | 配列の現在の要素。 |
<cfoutput>
<cfloop array="#aFoo#" index="x">
<li>#x#</li>
</cfloop>
</cfoutput>
生成されたHTML
これは、HTMLの各行の間に改行もあります。
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
現在のColdFusion 2016
属性
itemは、ColdFusion 2016以降のcfloopの動作を変更します。
index代わりにまたはindexに加えて属性itemを使用する。
パラメーター
| 属性 | 必須 | デフォルト | 説明 |
|---|---|---|---|
| アレイ | 真実 | 配列オブジェクト。変数は評価されなければならない(##でラップされる) | |
| 項目 | 真実 | 配列の現在の要素。 | |
| 索引 | 偽 | 配列の現在のインデックス。 |
<cfoutput>
<cfloop array="#aFoo#" item="x" index="y">
<li>#x# | #y#</li>
</cfloop>
</cfoutput>
生成されたHTML
これは、HTMLの各行の間に改行もあります。
<li>one | 1</li>
<li>two | 2</li>
<li>three | 3</li>
<li>four | 4</li>
CFScript
ColdFusion 8以前
<cfscript>
for (i = 1; x LTE arrayLen(aFoo); i = i + 1) {
writeOutput("<li>" & aFoo[i] & "</li>");
}
</cfscript>
現在のColdFusion 8から
<cfscript>
for (i = 1; i <= arrayLen(aFoo); i = i++) {
writeOutput("<li>" & aFoo[i] & "</li>");
}
</cfscript>
現在のColdFusion 9から
FOR IN構文では、xは現在の配列要素であり、配列の添字ではありません。
<cfscript>
for (x in aFoo) {
writeOutput("<li>" & x & "</li>");
}
</cfscript>
現在のColdFusion 11から
cfscript関数
cfloopはarrayサポートしていません。
生成されたHTML
cfscript出力はすべて1行にあることに注意してください。
<li>one</li><li>two</li><li>three</li><li>four</li>
ファイル
<cfloop list="#myFile#" index="FileItem" delimiters="#chr(10)##chr(13)#">
<cfoutput>
#FileItem#<br />
</cfoutput>
</cfloop>
構造
この構造を考えてみましょう。
<cfset stFoo = {
a = "one"
, b = "two"
, c = "three"
, d = "foue"
} />
タグ構文
パラメーター
indexなく属性item使用に注目してください。
| 属性 | 必須 | タイプ | デフォルト | 説明 |
|---|---|---|---|---|
| コレクション | 真実 | 構造 | structオブジェクト。変数は評価されなければなりません(##でラップされます)。 | |
| 項目 | 真実 | 文字列 | 現在の構造key 、 |
構造体関数の使用
<cfoutput>
<cfloop collection="#stFoo#" item="x">
<li>#structFind(stFoo, x)#</li>
</cfloop>
</cfoutput>
暗黙の構造構文
<cfoutput>
<cfloop collection="#stFoo#" item="x">
<li>#stFoo[x]#</li>
</cfloop>
</cfoutput>
生成されたHTML
これは、HTMLの各行の間に改行もあります。
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
CFScript
FOR IN構文では、xは構造体オブジェクトのkeyです。
構造体のキーを出力する
<cfscript>
for (x in stFoo) {
writeOutput("<li>" & x & "</li>");
}
</cfscript>
生成されたHTML
<li>A</li><li>B</li><li>C</li><li>D</li>
構造体のキーの値を出力する
構造体関数の使用
<cfscript>
for (x in stFoo) {
writeOutput("<li>" & structFind(stFoo, x) & "</li>");
}
</cfscript>
暗黙の構造構文
<cfscript>
for (x in stFoo) {
writeOutput("<li>" & stFoo[x] & "</li>");
}
</cfscript>
現在のColdFusion 11から
cfscript関数
cfloopはcollectionサポートしていません。
生成されたHTML
cfscriptの出力はすべて1行にあることに注意してください。
<li>one</li><li>two</li><li>three</li><li>four</li>
インデックスループ
from属性とto属性を使用して、反復回数を指定します。 (オプションの) step属性を使用すると、増分の大きさを判断できます。
<cfloop from="1" to="10" index="i" step="2">
<cfoutput>
#i#<br />
</cfoutput>
</cfloop>
条件ループ
condition属性を使用して、使用するconditionを指定します。
<cfset myVar=false>
<cfloop condition="myVar eq false">
<cfoutput>
myVar = <b>#myVar#</b> (still in loop)<br />
</cfoutput>
<cfif RandRange(1,10) eq 10>
<cfset myVar="true">
</cfif>
</cfloop>
<cfoutput>
myVar = <b>#myVar#</b> (loop has finished)
</cfoutput>
クエリループ
ColdFusionクエリの結果をループすることができます。
<cfquery name="getMovies" datasource="Entertainment">
select top 4 movieName
from Movies
</cfquery>
<cfloop query="getMovies">
#movieName#
</cfloop>
リストループ
(オプションの) delimiters属性を使用して、リスト内のセパレータとして使用される文字を指定することができます。
<cfloop list="ColdFusion,HTML;XML" index="ListItem" delimiters=",;">
<cfoutput>
#ListItem#<br />
</cfoutput>
</cfloop>
ファイルループ
ファイルをループすることができます。
<cfloop file="#myFile#" index="line">
<cfoutput>
#line#<br />
</cfoutput>
</cfloop>
COMコレクション/構造ループ
構造またはCOMコレクションをループすることができます。
<cfset myBooks = StructNew()>
<cfset myVariable = StructInsert(myBooks,"ColdFusion","ColdFusion MX Bible")>
<cfset myVariable = StructInsert(myBooks,"HTML","HTML Visual QuickStart")>
<cfset myVariable = StructInsert(myBooks,"XML","Inside XML")>
<cfloop collection="#myBooks#" item="subject">
<cfoutput>
<b>#subject#:</b> #StructFind(myBooks,subject)#<br />
</cfoutput>
</cfloop>