Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coldfusion 使用重新创建单个会话变量将会话变量拆分为数组_Coldfusion - Fatal编程技术网

Coldfusion 使用重新创建单个会话变量将会话变量拆分为数组

Coldfusion 使用重新创建单个会话变量将会话变量拆分为数组,coldfusion,Coldfusion,政府办公室让您记录里程的典型方式是在每个输入框中输入一个数字,如下例所示: 所以我要做的是创建一个输入框,它可以将会话变量拆分成一个数组。然后,当会话变量被拆分为一个数组时,我希望它将数组中的每个值设置为自己的会话变量 里程输入: 123456-session.checkout.vehicle.milies 数组[1,2,3,4,5,6] 6-session.checkout.vehicle.mileage1 5-session.checkout.vehicle.mileage2 4-sessi

政府办公室让您记录里程的典型方式是在每个输入框中输入一个数字,如下例所示:

所以我要做的是创建一个输入框,它可以将会话变量拆分成一个数组。然后,当会话变量被拆分为一个数组时,我希望它将数组中的每个值设置为自己的会话变量

里程输入: 123456-session.checkout.vehicle.milies

数组[1,2,3,4,5,6] 6-session.checkout.vehicle.mileage1 5-session.checkout.vehicle.mileage2 4-session.checkout.vehicle.mileage3 3-session.checkout.vehicle.mileage4 2-session.checkout.vehicle.mileage5 1-session.checkout.vehicle.mileage6

这样,我就可以在一个已经创建的表单中预先填充,该表单中每个框只拆分一个框

我非常困惑,试图理解的是,不会总是有6个变量。假设里程数是2344。我假设它需要知道从右到左开始倒数。这就是为什么我在session.checkout.vehicle.mileage1开始了第6次

希望我没有让任何人对我正在做的事情感到非常困惑。任何帮助都将不胜感激

<cfparam name="form.mileage" default="#session.checkout.vehicle.mileage#">
...
<label for="mileage">Mileage:</label>
<input type="text" name="mileage"
       id="mileage" 
       value="<cfoutput>#form.mileage#</cfoutput>">
编辑:

我遇到的问题是,假设里程数是9000,所有0都不会显示。这对于009000年的前两个0是很好的,但在9之后,这些0仍然需要显示出来。你对那个问题有什么想法吗?还是这应该是一个新问题

<cfset Mileage = "9000" />
<cfif mileage is not "Exempt">
  <cfset Mileage = NumberFormat(trim(Mileage),"000000") />
  <cfset MilArray = ReMatch("\d",Mileage) />
<cfelse>
  <cfset MilArray = ["E","x","e","m","p","t"]>
</cfif>
<cfdump var="#MilArray#">

<cfif MilArray[1] is not "0">
    <!---Section6 First box Odometer Reading---> 
    <cfpdfformparam name="E" value="#MilArray[1]#"> 
<cfelse>
    <cfpdfformparam name="E" value="">
</cfif>
这里有一个更简单的方法

originalNumber = "123";
sixDigitNumber = right(("000000" & originalNumber), 6);

<cfoutput>
<cfloop from="1" to = "6" index="position">

do something useful with #Mid(sixDigitNumber, position, 1)# 
</cfloop>
<cfoutput>
这里有一个更简单的方法

originalNumber = "123";
sixDigitNumber = right(("000000" & originalNumber), 6);

<cfoutput>
<cfloop from="1" to = "6" index="position">

do something useful with #Mid(sixDigitNumber, position, 1)# 
</cfloop>
<cfoutput>

如果我理解的话,你想把字符串分成六个易于处理的变量,或者不管变量的长度是多少

<cfset Mileage = "123456" />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfdump var="#MilArray#" />
\d在正则表达式中仅表示一位数字。与[0-9]相同

正如CFDUMP所显示的,重赛将把你的里程分成一个易于使用的阵列。例如,如果您使用如上所述的倒车档,您可以说里程的最后一位数字是MilArray[1]

编辑:

你知道那是什么吗?有没有办法让它要么是\d,要么只是“豁免”一词?有可能同时创建这两个吗

有几种方法

你可以说

<cfif mileage is not "Exempt">
    ...
<cfelse>
  <cfset MilArray = ["Exempt"]>
</cfif>
最后,虽然这里有关于是否使用StructKeyExists而不是IsDefined的争论,但IsDefined失败的领域很窄

不要将结构放在顶层和变量范围内。Cold Fusion会感到困惑,也就是说,不要创建名为variables.form或variables.url的对象。除此之外,它主要只是语义

无论如何。一旦您使用了上面的代码,因为它是您的代码并且您熟悉它,您可能会发现切换到更易于阅读的IsDefined版本很有用,因为IsDefined可以在一种情况下检查多个级别

  <cfif isDefined("session.checkout.info.oreading')>
    <cfset MilArray = ReMatch("\d",session.checkout.info.oreading) />
    <cfif not ArrayIsDefined(MilArray,6)>
      <cfpdfformparam name="E" value="">
      <!---Section6 First box Odometer Reading--->
    <cfelse>
      <cfpdfformparam name="E" value="#MilArray[6]#">
    </cfif>
  </cfif>
编辑3:

利指出


为什么这么复杂?你不能用空格或零来填充这个值吗?然后更改正则表达式以检查数字或空格?那么数组将始终有六个元素

这可以通过以下方式实现:

<cfset Mileage = "exempt" />
<cfif mileage is not "Exempt">
  <cfset Mileage = NumberFormat(trim(Mileage),"000000") />
  <cfset MilArray = ReMatch("\d",Mileage) />
<cfelse>
  <cfset MilArray = ["E","x","e","m","p","t"]>
</cfif>
<cfdump var="#MilArray#">
这将方便地放置在手边,因为它是6个字符

在开始生成pdf之前,需要进行一些预检查,以确保里程变量是免税的或数字的

<cfif len((trim(mileage)) gt 6 or not ((isNumeric(trim(mileage))
      or mileage is "exempt")>
  <!--- The 6 above is a len-check, you may need to update that number to 
        something else later, but you'll have to put the same number of 0s
        in the NumberFormat function.

        If you change that number, and the 0s, you'll need to pad the 
        "Exempt array"... ie ["E","x","e","m","p","t"," "] --->
  ....raise a flag...
</cfif>

如果我理解的话,你想把字符串分成六个易于处理的变量,或者不管变量的长度是多少

<cfset Mileage = "123456" />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfdump var="#MilArray#" />
\d在正则表达式中仅表示一位数字。与[0-9]相同

正如CFDUMP所显示的,重赛将把你的里程分成一个易于使用的阵列。例如,如果您使用如上所述的倒车档,您可以说里程的最后一位数字是MilArray[1]

编辑:

你知道那是什么吗?有没有办法让它要么是\d,要么只是“豁免”一词?有可能同时创建这两个吗

有几种方法

你可以说

<cfif mileage is not "Exempt">
    ...
<cfelse>
  <cfset MilArray = ["Exempt"]>
</cfif>
最后,虽然这里有关于是否使用StructKeyExists而不是IsDefined的争论,但IsDefined失败的领域很窄

不要将结构放在顶层和变量范围内。Cold Fusion会感到困惑,也就是说,不要创建名为variables.form或variables.url的对象。除此之外,它主要只是语义

无论如何。一旦您使用了上面的代码,因为它是您的代码并且您熟悉它,您可能会发现切换到更易于阅读的IsDefined版本很有用,因为IsDefined可以在一种情况下检查多个级别

  <cfif isDefined("session.checkout.info.oreading')>
    <cfset MilArray = ReMatch("\d",session.checkout.info.oreading) />
    <cfif not ArrayIsDefined(MilArray,6)>
      <cfpdfformparam name="E" value="">
      <!---Section6 First box Odometer Reading--->
    <cfelse>
      <cfpdfformparam name="E" value="#MilArray[6]#">
    </cfif>
  </cfif>
编辑3:

利指出


为什么这么复杂?你不能用空格或零来填充这个值吗?然后更改正则表达式以检查数字或空格?那么数组将始终有六个元素

这可以通过以下方式实现:

<cfset Mileage = "exempt" />
<cfif mileage is not "Exempt">
  <cfset Mileage = NumberFormat(trim(Mileage),"000000") />
  <cfset MilArray = ReMatch("\d",Mileage) />
<cfelse>
  <cfset MilArray = ["E","x","e","m","p","t"]>
</cfif>
<cfdump var="#MilArray#">
这将方便地放置在手边,因为它是6个字符

在开始生成pdf to mak之前,需要进行一些预检查 e确保里程变量为免税或数字

<cfif len((trim(mileage)) gt 6 or not ((isNumeric(trim(mileage))
      or mileage is "exempt")>
  <!--- The 6 above is a len-check, you may need to update that number to 
        something else later, but you'll have to put the same number of 0s
        in the NumberFormat function.

        If you change that number, and the 0s, you'll need to pad the 
        "Exempt array"... ie ["E","x","e","m","p","t"," "] --->
  ....raise a flag...
</cfif>

你可能把事情复杂化了。为什么您认为需要创建单独的变量来预先填充一组表单字段?javascript与此有什么关系?到目前为止,您所描述的内容都没有表明您确实需要这样做。您可以分离里程值并填充字段,而无需创建单独的会话变量。参见Dan关于如何从字符串中提取字符的示例。另外,您仍然没有解释javascript与此有什么关系……可能您将事情复杂化了。为什么您认为需要创建单独的变量来预先填充一组表单字段?javascript与此有什么关系?到目前为止,您所描述的内容都没有表明您确实需要这样做。您可以分离里程值并填充字段,而无需创建单独的会话变量。参见Dan关于如何从字符串中提取字符的示例。另外,您仍然没有解释javascript与此有什么关系……首先简单地显示每个数字。它会给你信心。事实上,如果您所要做的只是预先填充6个1个字符的文本框,则不一定需要循环。只需硬编码everything.session.checkout.vehicle.mileage1=middixDigitNumber,1,1;,session.checkout.vehicle.mileage2=中间位数,2,1;如Dan所说,如果您所做的只是填充6个文本框,那么不要麻烦循环封装javascript。包含ColdFusion代码。只要您有原始编号,就不清楚为什么需要额外的会话变量。只需显示每个数字即可。它会给你信心。事实上,如果您所要做的只是预先填充6个1个字符的文本框,则不一定需要循环。只需硬编码everything.session.checkout.vehicle.mileage1=middixDigitNumber,1,1;,session.checkout.vehicle.mileage2=中间位数,2,1;如Dan所说,如果您所做的只是填充6个文本框,那么不要麻烦循环封装javascript。包含ColdFusion代码。只要您有原始编号,就不清楚为什么需要额外的会话变量。为什么这么复杂?你不能用空格或零来填充这个值吗?然后更改正则表达式以检查数字或空格?然后数组将始终有六个元素。这是一个很好的观点,尽管Leigh附在了我的答案之后,演示了如何轻松地完成它。我只是想继续说,非常感谢大家!!我真的很感谢你们的帮助,你们的知识真是太棒了@Leigh对于您在上面发布的示例,我有一个问题,我想知道您是否知道所有0都不会显示,请查看您的CFIF代码。这正是您指示CF执行的操作。如果这不是你想要的结果-改变CFIF。为什么这么复杂?你不能用空格或零来填充这个值吗?然后更改正则表达式以检查数字或空格?然后数组将始终有六个元素。这是一个很好的观点,尽管Leigh附在了我的答案之后,演示了如何轻松地完成它。我只是想继续说,非常感谢大家!!我真的很感谢你们的帮助,你们的知识真是太棒了@Leigh对于您在上面发布的示例,我有一个问题,我想知道您是否知道所有0都不会显示,请查看您的CFIF代码。这正是您指示CF执行的操作。如果这不是您想要的结果-更改CFIF。