将PHP foreach循环转换为ColdFusion

Gur*_*awa 2 php coldfusion

我有PHP代码,它使用foreach循环来循环并创建一个查询.我试图将其转换为ColdFusion,但我迷路了.有人能说明如何做到这一点吗?

if ($deps) {
    $num = count($deps); 
    $i = 0;
    $addon = " AND (";
    foreach ($deps as $dep) {
        $addon .= " DEPARTMENT_ID='{$dep['dep']}'".($num != ++$i ? ' OR': '');
    }
    $addon .= ")";
} else {
    // Has been assigned no departments, so they can't see any tickets
    $addon = " AND (DEPARTMENT_ID='-1')";
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ton 5

以下是直接转换为CFML 的PHP ,即:使编译和运行所需的更改很少:

<cfscript>
    if (isDefined('$deps')) {
        $num = ArrayLen($deps);
        $i = 0;
        $addon = " AND (";
        for ($dep in $deps) {
            $addon &= " DEPARTMENT_ID='#$dep['dep']#'"&($num NEQ ++$i ? ' OR': '');
        }
        $addon &= ")";
    } else {
        // Has been assigned no departments, so they can't see any tickets
        $addon = " AND (DEPARTMENT_ID='-1')";
    }
</cfscript>
Run Code Online (Sandbox Code Playgroud)

以下是差异的屏幕截图,显示已更改的内容:

php和cfml代码的差异

变化是:

  • 需要isDefined来检查非空值.
  • ArrayLen而不是count来获取数组的大小.
  • foreach ( Y as X ) 翻译成 for ( X in Y )
  • 使用&&=连接,而不是..=
  • {braces}当括号表示var在字符串中时,PHP使用- 对于单个变量,它可以$varname直接进行并且将被评估.在CFML中,您#hashes#可以将变量的值放在字符串中.

请注意,CF允许您!=在脚本中使用,但NEQ必须在基于标记的代码中使用(cfif/cfset).

还要注意,虽然PHP要求变量以$符号开头,但CFML并不关心任何一种方式,因此它们并不需要被删除(即使它们是丑陋的噪音).


这是以更简单的方式完成的相同概念:

<cfscript>
    if ( NOT isDefined('deps') )
        deps[1] = {dep=-1};

    addon = [];
    for ( dep in deps )
        ArrayAppend(addon," DEPARTMENT_ID='#dep.dep#'");

    addon = " AND (#ArrayToList(addon,' OR')#)";
</cfscript>
Run Code Online (Sandbox Code Playgroud)

以下是类似代码如何与cfqueryparam一起使用的示例:

<cfscript>
    if ( isDefined('deps') )
    {
        depIds = [];

        for ( dep in deps )
            ArrayAppend(depIds,dep.dep);
    }
    else
    {
        depIds = [-1];
    }
</cfscript>
<cfquery>
    ...
    <cfif ArrayLen(depIds) >
        AND DEPARTMENT_ID IN (<cfqueryparam list value=#ArrayToList(depIds)# cfsqltype="cf_sql_integer" />)
    </cfif>
</cfquery>
Run Code Online (Sandbox Code Playgroud)

(正确的代码当然会使用更好的变量名和适当的范围.)