ColdFusion:如何检查数组元素是否存在?
ColdFusion: how to check if array element exists?
我必须遍历街道地址数组并将数据插入数据库。用户总是提供一行地址,有时两行。
我正在尝试循环数组并动态设置 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,必须是语法上有效的变量名。
IsDefined 只能告诉您是否存在名为 jsonData.addresses.customer.street
的变量。它不能检查内容,所以它是这个场景的错误函数。
假设 street
数组始终存在,只需使用成员函数 len(), or 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"变量
根据您最终要执行的操作,您可以考虑将地址信息保留为数组,因为在处理动态数量的元素时它更容易处理。但是,如果您愿意,也可以使用 <cfloop array="..">
动态定义单独的 address_x
变量
<!--- 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 的一个经常被误解的细节是函数需要变量的 name,通常是引号中的纯字符串,例如 "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()
只接受valid CF variable names. So it can't be used on variable names containing special characters (spaces, square brackets, etc..) - meaning it won't work with a variable named Suite 300
. That limitation is one of the reasons why StructKeyExists(),通常是推荐的。
这个问题的简单答案就是使用 ArrayIsDefined
<cfif ArrayIsDefined(yourArray, index)>
<!--- perform your logic here --->
</cfif>
这样你也可以防止可能出现的错误
我必须遍历街道地址数组并将数据插入数据库。用户总是提供一行地址,有时两行。 我正在尝试循环数组并动态设置 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,必须是语法上有效的变量名。
IsDefined 只能告诉您是否存在名为 jsonData.addresses.customer.street
的变量。它不能检查内容,所以它是这个场景的错误函数。
假设 street
数组始终存在,只需使用成员函数 len(), or 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"变量
根据您最终要执行的操作,您可以考虑将地址信息保留为数组,因为在处理动态数量的元素时它更容易处理。但是,如果您愿意,也可以使用 <cfloop array="..">
address_x
变量
<!--- 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 的一个经常被误解的细节是函数需要变量的 name,通常是引号中的纯字符串,例如 "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()
只接受valid CF variable names. So it can't be used on variable names containing special characters (spaces, square brackets, etc..) - meaning it won't work with a variable named Suite 300
. That limitation is one of the reasons why StructKeyExists(),通常是推荐的。
这个问题的简单答案就是使用 ArrayIsDefined
<cfif ArrayIsDefined(yourArray, index)>
<!--- perform your logic here --->
</cfif>
这样你也可以防止可能出现的错误