希望有人能让我知道我做错了什么。
我正在循环一个数组并输出值....就够了。但是,如果某个字段为空,我会收到Element <VARIABLE> is undefined in <INDEX>
。
E.g。
<cfloop array="#allocationDetails.offerings#" index="myIndex">
#myIndex.name#
#myIndex.number#
#myIndex.somefield#
</cfloop>
这样可以正常工作,直到某个字段没有值。例如,myIndex.somefield为空,然后我收到错误:
“myIndex中的元素somefield未定义”
如果我将字段输出包装在isDefined(“myIndex.somefield”)或structKeyExists(myIndex,“somefield”)等检查中,它们会返回true,但后来我得到错误“元素somefield在myIndex中未定义”尝试输出字段值。
我也在myIndex.somefield上尝试了cfdump并得到了同样的错误。
我原本以为这是一个非常基本的事情,但我不明白为什么这会出错。我错过了一些非常明显的东西吗?
感谢您的帮助。
干杯 标记
答案 0 :(得分:4)
也许该索引没有数组元素?例如:
<cfscript>
myArr = ArrayNew(1);
myArr[1] = 'xx';
myArr[2] = 'yy';
myArr[4] = 'zz';
</cfscript>
如果你尝试循环它,你可以添加一个ArrayIsDefined检查:
<cfloop array="#myArr#" index="myIndex">
<cfif ArrayIsDefined(myArr, myIndex)>
#myIndex#
</cfif>
</cfloop>
如果没有,那么总会尝试捕获:
<cfloop array="#myArr#" index="myIndex">
<cftry>
#myIndex#
<cfcatch type="any">
Error or default variable setting here
</cfcatch>
</cftry>
</cfloop>
答案 1 :(得分:1)
这是完全未经测试的,但你尝试过这样的事吗?
<cfloop array="#allocationDetails.offerings#" index="myIndex">
<cfparam name="myIndex.name" default="" />
<cfparam name="myIndex.number" default="" />
<cfparam name="myIndex.somefield" default="" />
#myIndex.name#
#myIndex.number#
#myIndex.somefield#
</cfloop>
答案 2 :(得分:1)
如果你正在使用ColdFusion 9,你得到的错误是由于未定义,或者从webservice调用返回NULL值。试试这个:
<cfif StructKeyExists(myIndex, "somefield") AND NOT IsNull(myIndex.somefield)>
#myIndex.somefield#
</cfif>
答案 3 :(得分:0)
转储#allocationDetails.offerings#并查看输出。
您基本上是在数组上循环。因此,您将能够看到每个指数值的结果。
此外,可能是愚蠢但有时它的作用。 将allocationDetails.offerings分配给变量,然后循环该变量。
<cfset some_var = allocationDetails.offerings />
<cfloop array="#some_var#" index="indexNow">
.
.
</cfloop>
最后, 还要将索引的变量从myIndex更改为其他名称。
答案 4 :(得分:0)
<cfscript>
allocationDetails.offerings = ArrayNew(1);
allocationDetails.offerings[1] = {name = 'a', number = 1 , somefield = "somevalue"};
allocationDetails.offerings[2] = {name = 'a', number = 2 , somefield = "somevalue"};
allocationDetails.offerings[4] = {name = 'c', number = 3 , somefield = "somevalue"};
</cfscript>
<cfoutput>
<cfloop array="#allocationDetails.offerings#" index="myIndex">
<cfparam name="myIndex.name" default="" />
<cfparam name="myIndex.number" default="" />
<cfparam name="myIndex.somefield" default="" />
#myIndex.name# : #myIndex.number# : #myIndex.somefield#<br>
</cfloop>
</cfoutput>
史蒂夫解决方案将正常工作。
答案 5 :(得分:0)
在循环(我的实际代码循环Web服务数组)中,如果我使用类似的东西:
#StructKeyList(myIndex)#
它会在myIndex中吐出一个可用键列表,其中包含所有预期的字段名称,包括存在但为空的字段。
所以像StructKeyExists(myIndex,“somefield”)或isDefined(“myIndex.somefield”)这样的检查返回true,因为密钥确实存在。但是,如果我然后尝试输出字段myIndex.somefield我得到的元素somefield在myIndex错误中是未定义的。我不明白为什么这是一个问题。我也试过使用,但似乎没有做任何事情(对我的数组)。
如果我在示例数组和循环上尝试所有前面的步骤,它将按预期工作。就在我尝试上述Web服务的结果时,我遇到了问题。
有没有人在处理网络服务记录集时遇到过这个问题(在CF8上)?
现在进行解决......一个有效的建议(感谢Leigh)而不是使用myIndex.somefield是在Web服务中调用getSomeField方法并使用其结果(即使值为空也能正常工作)。
我刚试过的另一件事(无论出于何种原因)工作是从isDefined中删除索引名,所以代替:
isDefined(“myIndex.somefield”)
我用:
isDefined(“somefield”)
同样,这似乎是与CF8相关的问题,因为如果我使用StructKeyExists,IsDefined或IsNull在CF9上运行代码,它们都可以按预期工作。
答案 6 :(得分:0)
我做了类似的事情。我想要一个可能有未定义值的数组的平均值。我终于提出了两种不同的方法来做到这一点。
<cffunction name="ArrayAvg2">
<cfargument name="theArray" required="true">
<cfset sum=0>
<blockquote>
<cfloop from=1 to="#ArrayLen(theArray)#" index="i">
<cfif ArrayIsDefined(theArray, i)>
<cfoutput>theArray[#i#] = #theArray[i]#</cfoutput>
<cfset sum += theArray[i]>
<cfelse>
Undefined
</cfif>
<br/>
</cfloop>
</blockquote>
<cfreturn sum>
</cffunction>
<cffunction name="ArrayAvg3">
<cfargument name="theArray" required="true">
<cfset sum=0>
<blockquote>
<cfloop from=1 to="#ArrayLen(theArray)#" index="arrayElement">
<cfif ArrayIsDefined(theArray, arrayElement)>
<cfoutput>theArray[#arrayElement#] = #theArray[arrayElement]#</cfoutput>
<cfset sum += theArray[arrayElement]>
<cfelse>
Undefined
</cfif>
<br/>
</cfloop>
</blockquote>
<cfreturn sum>
</cffunction>
<cfset testArray=ArrayNew(1)>
<!--- no testArray[2] --->
<cfset testArray[1]=10>
<cfset testArray[3]=30>
testArray = <cfdump var="#testArray#">
<br/>
ArrayAvg2 = <cfdump var="#ArrayAvg2(testArray)#">
<br/>
ArrayAvg3 = <cfdump var="#ArrayAvg3(testArray)#">
我希望这会有所帮助。
(顺便说一句,我是ColdFusion的noobie,所以如果你看到任何我做错了,请告诉我!)