Coldfusion如何将一个数组分成两个?

5

我可以将一个数组分成两个独立的数组,每个原始数组中的元素由“:”分隔吗?冒号前面的文本放在array1中,冒号后面的文本放在array2中。

<cfset tempArr = DeserializeJSON(URL.data) />
<cfset selectList = "" />
    <cfloop array=#tempArr# index="i">
<cfset selectList = listappend(selectList,i) />
</cfloop>

目前这段代码获取整个元素而不是分开获取。

编辑

一个示例字符串如下:

first_name:Bob


first_name进入selectList1 Bob进入selectList2


总体的方案也会有其他字段,例如:

first_name:Bob

last_name:Shmo

age:27

等等...

编辑:答案

通过使用以下代码解决了问题

<!---Variables--->
<cfset temp1 = "" />
<cfset temp2 = "" />
<cfset selectList1 = "" /><!---Holds column names for tables--->
<cfset selectList2 = "" /><!---Holds query parameters for column names. Ie,
                                    values for use in the WHERE clause--->

<cfloop array=#tempArr# index="i"><!---Loop through contents of the array--->
    <cfset temp1 = GetToken(i,1,":")/><!---Store the column name--->
    <cfset temp2 = GetToken(i,2,":")/><!---Query parameter--->

    <cfset selectList1 = listAppend(selectList1, temp1)/><!---Adds to list of column names--->
    <cfset selectList2 = listAppend(selectList2, temp2)/><!---Adds to the list of query parameters--->
</cfloop>
3个回答

9
我认为在没有看到您的数组示例的情况下,您的意思是将数组中的数据拆分为两个列表?
<cfset selectList1 = listAppend(selectList1, listFirst(i,':')) >
<cfset selectList2 = listAppend(selectList2, listLast(i,':')) >

2
另一个选项是使用 getToken。它相对于 listFirst/Last 的优势在于您不需要验证长度。如果给定的列表元素不存在,getToken 将返回一个空字符串。在这种情况下,如果它少于两个元素。 - Leigh
1
@JimRilye - getToken(value, position, ":") 可能可以解决问题。但请更新你的问题以包括字符串样例和期望结果。 - Leigh
1
@JimRilye - 抱歉,我没有看到区别;-) 如果单个数组元素i始终包含由单个冒号分隔的两个字符串,即foo:bar,那么williambq的原始代码应该可以正常工作。(个人更喜欢getToken,但从技术上讲,两者都可以。) - Leigh
4
通常情况下,CF的迭代是从0开始的。不,大多数情况是以1为基础的。 - Leigh
是的,我的意思是不以0开头。 - williambq
显示剩余3条评论

1
<cfscript>   
variables.lstString             = "First_Name:John,Last_Name:McClane";
variables.lstFields             = "";
variables.lstValues             = "";

for(variables.i=1;variables.i lte listlen(variables.lstString,',');variables.i++){
    variables.lstFields         &= (listlen(variables.lstFields) gt 0) ? ",#getToken(getToken(variables.lstString,variables.i,','),1,':')#" : getToken(getToken(variables.lstString,variables.i,','),1,':');
    variables.lstValues         &= (listlen(variables.lstValues) gt 0) ? ",#getToken(getToken(variables.lstString,variables.i,','),2,':')#" : getToken(getToken(variables.lstString,variables.i,','),2,':');
}

writeDump(variables.lstFields);
writeDump(variables.lstValues);
</cfscript>

0
为什么不将数组转换为列表?
<cfset list = arraytolist(array,",")>

然后使用正则表达式获取元素的第一块,例如数组长度的一半或您喜欢的任何块大小。

<cfset chunksize = int(listlen(list)/2)+1>

然后在每个元素中使用列表部分(chunK)创建一个新的数组:

<cfscript>
    function ListSplit(list, chunkysize, delim)
    {
        var result = ArrayNew(1); 
        var re = "";
        var start = 1;
        while(1) {
            re = REFind("((?:[^#delim#]+#delim#){1,#chunkysize#})", list & delim, start, "true");
            if( re.len[1] eq 0 ) break;
            ArrayAppend(result, Mid(list,re.pos[1],re.len[1]-len(delim)));
            start = re.pos[1] + re.len[1];
            if(start gte len(list)) break;
        }
        return result;
    }
</cfscript> 
<cfset newarray = ListSplit(list, chunksize, ",")>

例如,列表为 1,2,3,5,10,11,22,33,44,55,60,61,62,63,64 如果你想将列表分成两个块, 那么块大小将是8, 数组将是 result[1] = "1,2,3,5,10,11,22,33" result[2] = "44,55,60,61,62,63,64"
或者用以下代码获取3个块
gives you result[1] = "1,2,3,5,10" result[2] = "11,22,33,44,55" result[3] = "60,61,62,63,64"
等等。
我从Nathan Youngman那里找到了这个脚本 https://gist.github.com/nathany/742242 它非常有用,可以将长列表或数组分成给定大小的块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接