CFMLで配列(Array)とか構造体(Struct)とかを横に伸ばして書きたい
CFMLをどうも本気でやらなければならない状況になってきている今日この頃です。
ところで、CFMLの配列の書き方がイヤなのです。とてもイヤです。
CFMLでの配列はこんな感じで作ります。
<cfset arr=ArrayNew(3) /> <cfset ArrayAppend("val1") /> <cfset ArrayAppend("val2") /> <cfset ArrayAppend("val3") />
縦に伸びていく。これがイヤなんです。横に伸ばしたいんです。こんな風に。
arr={"val1","val2","val3"}
ちょっと工夫して、こうしてみるのはどうか。
<cffunction name="text2Array" output="false" returntype="array" > <cfargument name="text" type="string" required="true"> <cfargument name="delimiter" type="string" required="false" default=","> <cfset var retArray=ArrayNew(1) /> <cfloop index="row" list="#Trim(ARGUMENTS.text)#" delimiters="#ARGUMENTS.delimiter#"> <cfset ArrayAppend(retArray, Trim(row)) /> </cfloop> <cfreturn retArray > </cffunction> <cfset arr=text2Array("val1,val2,val3") />
あと、僕はハッシュの入った配列をよくつかうのです。
cfでも使いたい。
某だんこーがい氏が以前言及してたような感じで。
列1,列2,列3 値1,値2,値3 ・ ・ ・
というわけで、こうしてみたらと思うのだが、どうか。
<cffunction name="text2StructArray" output="false" returntype="array" hint="文字列を構造体の配列に変換します<br>1行目を要素名とし、それ以降の行を要素名に対応する値として変換します"> <cfargument name="text" type="string" required="true"> <cfargument name="delimiter" type="string" required="false" default=","> <cfset var retArray=ArrayNew(1) /> <cfset var colArray="" /> <cfloop index="row" list="#Trim(ARGUMENTS.text)#" delimiters="#Chr(10)##Chr(13)#"> <cfif NOT IsArray(colArray) > <cfset colArray=ArrayNew(1) /> <cfloop index="col" list="#Trim(row)#" delimiters="#ARGUMENTS.delimiter#"> <cfset ArrayAppend(colArray, Trim(col)) /> </cfloop> <cfelse> <cfset rowStruct=StructNew() /> <cfset loopIdx=0 /> <cfset rowstr=row /> <cfloop index="val" list="#Trim(rowstr)#" delimiters="#ARGUMENTS.delimiter#"> <cfset loopIdx=loopIdx+1 /> <cfif loopIdx LE ArrayLen(colArray) > <cfset StructInsert(rowStruct, colArray[loopIdx], Trim(val)) /> <cfelse> <cfthrow type="Application" errorcode="argument-Exception" message="rows doesn't agree with values." /> </cfif> </cfloop> <cfset ArrayAppend(retArray, rowStruct) /> </cfif> </cfloop> <cfreturn retArray > </cffunction> <!--- こう使う ---> <cfsavecontent variable="text" > col1 ,col2 ,col3 val11 ,val12 ,val13 val21 ,val22 ,val23 val31 ,val32 ,val33 </cfsavecontent> <cfset structArr=text2StructArray(text) /> <cfdump var="#structArr#" /> <!--- こんな感じになる 1:col1:val11 col2:val12 col3:val13 2:col1:val21 col2:val22 col3:val23 3:col1:val31 col2:val32 col3:val33 --->
んーと、昼休み終わった・・・