【问题标题】:Converting PHP foreach loop to ColdFusion将 PHP foreach 循环转换为 ColdFusion
【发布时间】:2014-02-18 16:09:21
【问题描述】:

我有 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')";
}

【问题讨论】:

标签: php coldfusion


【解决方案1】:

这里是把PHP直接翻译成CFML,也就是:只需要少量改动就可以编译和运行:

<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>

这是一个差异的屏幕截图,显示了更改的内容:

变化是:

  • 需要isDefined 来检查非空值。
  • ArrayLen 而不是 count 来获取数组的大小。
  • foreach ( Y as X ) 转换为 for ( X in Y )
  • 使用&amp;&amp;= 进行连接,而不是..=
  • 当括号符号 var 在字符串中时,PHP 使用 {braces} - 对于单个变量,它可能直接是 $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>

以下是类似代码如何与 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>

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

【讨论】:

  • 对您在此处提供的代码的解释很好
【解决方案2】:

忘记 php 代码。看起来它正在寻找这样的东西:

and (
department_id = value1
or
department_id = value1
etc
)

相反,请尝试创建如下内容:

and departent_id in 
(<cfqueryparam cfsqltype="cf_sql_integer" value="#SomeList#" list="yes">)

您可以使用条件逻辑来创建 SomeList 变量。它可以是“1,3,5”或“-1”,具体取决于 $deps 变量的 ColdFusion 等效项。

【讨论】:

  • 所以基本上每个循环都在创建一个列表,
  • 不一定。你可能已经有了一个。您的 php 应用程序中的 $deps 变量来自哪里?
【解决方案3】:

我喜欢 Dans 解决方案,但这里是您翻译成 CF 的代码:

<cfif IsDefined('deps')>
   <cfset num = ArrayLen(deps)>
   <cfset i = 0>
   <cfset addon = " AND (">

   <cfloop array="#deps#" index="dep">
      <cfset addon &= " DEPARTMENT_ID='#dep#'" & num NEQ ++i ? ' OR': ''>
   </cfloop>
       <cfset addon &= ")">
<cfelse>
    <cfset addon &= " AND (DEPARTMENT_ID='-1')">
</cfif>

【讨论】:

  • 你确定你的括号在正确的位置吗?
  • 已解决@osekmedia,也感谢您的代码。另外我更喜欢使用 StructKeyExists 而不是 isDefned,我讨厌它
  • 我想我们都同意&lt;cfqueryparam list&gt; 更简单。但是,IMO 看到翻译仍然非常有用,因为它展示了一些 php 和 CF 函数之间的相关性。一旦你理解了代码,就会发现原来的 PHP 代码效率低下。然后你可以把它全部扔到窗外,改用 cfqueryparam,确保你没有丢失任何东西,只是效率低下的代码;-)
  • 我不同意“完全按照介绍” - 请参阅我刚刚添加的答案。至于它有什么问题,那么您已经发现并纠正了 != 和错误放置的右括号 - 但您仍然错过了 $dep 是一个结构,更重要的是您需要保留括号三元运算符以防止条件成为整个" DEPARTMENT_ID='#dep#'" &amp; num NEQ ++i
  • (编辑)@PeterBoughton - 我不认为这是一个完美的翻译,但 IMO 至少对于 OP 来说是一个好的开始。 (当时没有类似的帖子)。鼓励他们学习 something 关于 php 语法,而不仅仅是提供答案,这将有助于他们未来的翻译,因此他们不会发布像这样的笼统问题(提示,提示)。即教人钓鱼。这不是对任何提供答案的人的抨击,只是我的 0.02 美元
猜你喜欢
  • 2021-03-12
  • 2014-12-11
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多