我有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)
以下是直接转换为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)
以下是差异的屏幕截图,显示已更改的内容:
变化是:
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)
(正确的代码当然会使用更好的变量名和适当的范围.)
归档时间: |
|
查看次数: |
720 次 |
最近记录: |