使用空值循环数组时元素未定义错误

时间:2011-03-21 01:56:32

标签: coldfusion

希望有人能让我知道我做错了什么。

我正在循环一个数组并输出值....就够了。但是,如果某个字段为空,我会收到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并得到了同样的错误。

我原本以为这是一个非常基本的事情,但我不明白为什么这会出错。我错过了一些非常明显的东西吗?

感谢您的帮助。

干杯 标记

7 个答案:

答案 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,所以如果你看到任何我做错了,请告诉我!)