2

我必须遍历街道地址数组并将数据插入数据库。用户总是提供一行地址,有时提供两行。我正在尝试循环数组并动态设置 address_1 和 address_2(如果存在,如果不存在,则为 NULL),但它对我不起作用。

数组转储的图像

这是我所拥有的:

<cfset address_1 = #jsonData.addresses.customer.street[1]#>
<cfif isDefined(jsonData.addresses.customer.street[2])>
    <cfset address_2 = #jsonData.addresses.customer.street[2]#> 
<cfelse>    
    <cfset address_2 = "">
</cfif>

当我运行它时,我得到: 函数 IsDefined 的参数 1,现在是 Suite 300,必须是语法上有效的变量名。

4

2 回答 2

4

IsDefined只能告诉您是否jsonData.addresses.customer.street存在名为的变量。它无法检查内容,因此在这种情况下它是错误的功能。

假设street数组始终存在,只需使用成员函数len()ArrayLen()检查它的大小。如果大小是>= 2,那么您知道第二个地址存在。

<!--- Option 1: Member function len()  --->
<cfif jsonData.addresses.customer.street.len() gte 2 > 
   2nd address exists, do something 
</cfif>

<!--- Option 2: ArrayLen() --->
<cfif arrayLen(jsonData.addresses.customer.street) gte 2 > 
   2nd address exists, do something 
</cfif>

动态“address_x”变量

根据您最终要做的事情,您可能会考虑将地址信息保留为数组,因为在处理动态数量的元素时更容易处理。但是,如果您愿意,也可以address_x动态定义单独的变量,使用 <cfloop array="..">

<!--- demo data --->
<cfset jsonData.addresses.customer.street = ["Line1","Line2","Line3"]>

<cfloop array="#jsonData.addresses.customer.street#" item="line" index="pos">
    <!--- Use the current position to name variables xx_1, xx_2, xx_3 --->
    <cfset variables["address_"& pos] = line>
</cfloop>

<!--- results --->
<cfdump var="#variables#">

结果:

生成变量的图像


关于原始错误

关于IsDefined的一个经常被误解的细节是该函数需要一个变量的名称,该变量通常是一个带引号的纯字符串,例如"myVariable". 因为这里的变量名没有引号:

<cfif isDefined( jsonData.addresses.customer.street[2] )>

...该变量被评估,其是实际传递给 IsDefined() 的值。所以代码最终检查了错误的变量名:

<!--- code is really doing this (thinks address[2] is the variable name) --->
<cfif isDefined("Suite 300")>

触发错误的原因是因为IsDefined()只接受有效的 CF 变量名。因此它不能用于包含特殊字符(空格、方括号等)的变量名——这意味着它不适用于名为Suite 300. 该限制是通常推荐使用StructKeyExists()的原因之一。

于 2019-08-08T17:16:56.973 回答
1

这个问题的简单答案是只使用ArrayIsDefined

<cfif ArrayIsDefined(yourArray, index)>
    <!--- perform your logic here --->
 </cfif>

这样您还可以防止可能的错误

于 2022-01-18T06:35:16.487 回答