如何从list和cfquery构建数组?

时间:2016-03-23 14:19:13

标签: arrays list coldfusion populate cfquery

我正在尝试构建一个数组,它将从我的列表中提供所有值,然后根据cfquery的记录,我想获得多年的值。为了使这个更清楚,我将在下面向您展示我的数组应该是什么样的:

time slot   year2015   year 2016
0700            0          0
0715            1          0
0730            0          0
0745            0          0
0800            0          5

等等。我的时间段值存储在<cfset dataList>中,如下所示:

<cfloop list="#ListGetAt(dataList,i,",")#" index="k" delimiters="|">
        <cfoutput>#k#</cfoutput>
    </cfloop>

0600 0615 0630 0645 0700 0715 0730 0745 0800 0815 0830 0845 0900 0915 0930 0945 1000 1015 1030 1045 1100 1115 1130 1145 1200 1215 1230 1245 1300 1315 1330 1345 1400 1415 1430 1445 1500 1515 1530 1545 1600 1615 1630 1645 1700 1800 1900 2000 2100 2200 2300 0000 

我的时间段,年份和每年的值都来自cfquery,如下所示:

<cfoutput query="getRecords" group="YearRecord">
    <cfoutput>
        #TimeSlot# - #YearRecord# - #ValueYear#<br/>
    </cfoutput> 
</cfoutput>

0830 - 2015 - 2
0915 - 2015 - 2
1000 - 2015 - 1
0630 - 2016 - 1
0800 - 2016 - 1

我的记录来自两个不同的地方。我的列表中的时间段和来自我的cfquery的有效值的记录。所以我想构建包含列表中所有记录的数组,并为每个记录输出有效值的年份列。所以我首先尝试使用列表中的元素填充我的数组:

<cfset myArray=ArrayNew(1)>

<cfloop list="#ListGetAt(dataList,i,",")#" index="z" delimiters="|">
    <cfoutput>
        #myArray[z]#
    </cfoutput>
</cfloop>

这段代码给我一个错误:

Type: Expression ********** Line: 253 ********** ********** The element at position 600 of dimension 1, of array variable &quot;MYARRAY,&quot; cannot be found.

在我填充数组之后,我还要向该数组添加两个元素。每年的年份和价值观。如果有人知道我做错了什么,最好的方法是什么,请告诉我。提前致谢。

2 个答案:

答案 0 :(得分:1)

开始时。不知道为什么到处都在使用ListGetAt(dataList,i,&#34;,&#34;)。那是在更大的循环中吗?

此代码

<cfset myArray=ArrayNew(1)>

<cfloop list="#ListGetAt(dataList,i,",")#" index="z" delimiters="|">
    <cfoutput>
        #myArray[z]#
    </cfoutput>
</cfloop>

抛出错误,因为当您循环遍历列表时,myArray为空。如果你想以那种方式填充它,你就像那样做

<cfset myArray=ArrayNew(1)>
<cfset yourList = ListGetAt(dataList,i,",")>
<cfloop list="#yourList#" index="z" delimiters="|">
    <cfset myArray.append(z)>
</cfloop>

或只是

<cfset yourList = ListGetAt(dataList,i,",")>
<cfset myArray = ListToArray(yourList)>

但如果我理解得很好,你需要二维数组。你应该这样做。

<cfset myArray=ArrayNew(2)>
<cfset yourList = ListGetAt(dataList,i,",")>
<cfloop list="#yourList#" index="z" delimiters="|">
    <!--- we will append array with our value. later you can append to this year and other values from query --->
    <cfset myArray.append([z])>
</cfloop>

编辑1 也许你应该考虑Struct而不是数组?创建以所有时间段为关键字的结构。我会用简短的​​符号。

<cfset str = {}>
<cfloop list="#yourList#" index="z" delimiters="|">
    <cfset str[z] = {'y2015'=0,'y2016'=0,'valYear'=0}>
</cfloop>

<cfoutput query="getR" group="theYear">
    <cfif theYear eq 2015>
        <cfset str[z]['y2015'] = theCount>
    <cfelse>
        <cfset str[z]['y2016'] = theCount>
    </cfif>
</cfoutput>
<cfdump var="#str#">

现在你可以使用StructKeyList来获取该stuct的key列表,以循环该结构。

答案 1 :(得分:1)

如果要向数组中添加内容,请使用arrayAppend。请记住,这是一个功能,所以请它:

arrayAppend(myArray, thingsToAdd);

仅在Lucee或CF2016中,它的工作方式为:

myArray.arrayAppend(thingToAdd);