ColdFusion: Как проверить, существует ли определенный элемент в двумерном массиве? - PullRequest
5 голосов
/ 25 июня 2009

У меня есть двумерный массив. Я записываю 3 значения в массив во время его инициализации и добавляю четвертое значение, если значение массива не равно значению, переданному через форму. Затем я хочу проверить, существует ли четвертое значение.

update.cfm

<cfset array = obj.getArray() />
<cfif not StructIsEmpty(form)>
  <cfloop collection="#form#" item="key">
    <cfif left(key,3) eq "ID_">
      <cfset number = listLast(key,"_") />
      <cfset value = evaluate(0,key) />
      <cfloop index="j" from="1" to="#arrayLen(array)#">
        <cfif (array[j][1] eq number) and (array[j][3] neq value)>
          <cfset array[j][3] = value />
          <cfset array[j][4] = "true" />
        </cfif>
      </cfloop>
    </cfif>
  </cfloop>
<cfset obj = createObject("component", "cfc.Obj").init(arg = form.arg, argarray = array) />
<cfset application.objDao.update(obj) />

objDao.cfc метод обновления

<cfset matarray = arguments.obj.getArray() />
  <cfloop index="i" from="1" to="#arrayLen(array)#">
    <cfquery name="qUpdateAsset" datasource="#variables.instance.dsn#">
      UPDATE table
      SET value = <cfqueryparam value="#matarray[i][3]#" cfsqltype="cf_sql_integer" />

    <!--- This is wrong, how do i check the existence correctly? --->
    <cfif StructKeyExists(matarray[i],"4")>
      ,status = 'true'
    </cfif>

      WHERE arg = <cfqueryparam value="#arguments.obj.getArg()#" cfsqltype="cf_sql_smallint" />
        AND number = <cfqueryparam value="#matarray[i][1]#" cfsqltype="cf_sql_integer" />
  </cfquery>
</cfloop>

Моя неправильная попытка приводит к этой ошибке:

Вы попытались разыменовать скалярную переменную типа class coldfusion.runtime.Array как структуру с членами.

Ответы [ 2 ]

8 голосов
/ 25 июня 2009

Я считаю, что вам просто нужно проверить длину массива следующим образом:

<cfif ArrayLen(matarray[i]) gte 4>
      ,status = 'true'
</cfif>
0 голосов
/ 25 июня 2009

Ну, для начала, я не большой парень из Cold Fusion ... но я уверен, что вы не можете использовать StructKeyExists для Array, так как это не структура.

Кроме того, вы пробовали что-то вроде

<cfset testValue = matarray[i][4]>
<cfif isDefined testValue>
    ...
</cfif>
...