如何填充然后对数组进行排序或随机化?

时间:2011-10-04 18:44:04

标签: arrays coldfusion

我正在使用ColdFusion 9.1。我正在使用CFSCRIPT进行编码。

我正在创建一个测验。查询一个将获得一个人的图像和图像中人的人。这将是正确的答案。查询二将获得另外两个不在图像中的人。我想把它放到一个数组中,然后对数组进行排序,以便正确的答案不总是在顶部或底部或中间。

这是我的伪SQL:

QUERY ONE NAME = GET CORRECT ANSWER
SELECT TOP 1 ImageID, PersonID, FirstName, LastName
FROM IMAGES

QUERY TWO NAME =  GET TWO INCORRECT ANSWERS
SELECT TOP 2 PersonID, FirstName, LastName
FROM IMAGES 
WHERE ImageID IS NOT THE CORRECT ANSWER

我“想”我希望我的阵列看起来像这样:

PersonID="1234";
FirstName="Bob";
LastName="Jones";

我需要遍历每个查询并使用查询返回的三个人填充此数组。像这样,但这段代码不起作用:

<cfscript>
PersonArray = arrayNew(1);
for (i = 1; i lte GetTwoWrong.RecordCount; i++) {
    Person = structNew();
    Person.PersonID = GetTwoWrong.PersonID[i];
Person.FirstName = GetTwoWrong.FirstName[i];
Person.LastName = GetTwoWrong.LastName [i];
PersonArray = arrayAppend(PersonArray , Person);

}
</cfscript>

然后我需要通过FirstName,LastName或PersonID对数组进行排序,以创建任何类型的随机性。

<cfscript>
PersonArray = arraySort(PersonArray numeric);
</cfscript>

然后我需要输出答案。答案是可点击的。点击后,我将通过jQuery发送PersonID来检查答案的正确性(并存储选择)。

那么,我如何创建一个数组,然后从两个不同的查询中填充它然后对它进行排序?我应该使用阵列吗?结构?

2 个答案:

答案 0 :(得分:1)

我会在数据库中执行此操作,不那么复杂。这是一个例子:

SELECT * FROM (
    SELECT TOP 1 1 AS Correct, ImageID, PersonID, FirstName, LastName, UniqueToCorrectAnswer
    FROM IMAGES
    UNION ALL
    SELECT TOP 2 0 AS Correct, ImageID, PersonID, FirstName, LastName, NULL AS UniqueToCorrectAnswer
    FROM IMAGES 
    WHERE ImageID IS NOT THE CORRECT ANSWER
) AllAnswers
ORDER BY NewID()

UNION两侧的两个查询对于不同的数据库,表和条件可能完全不同,只要它们都返回相同的列。你会注意到在第二个查询中,我为那里不存在的东西返回一个NULL值,但确实存在于第一个查询中(只是一个例子)。因此,您可以看到如何从UNION的每一侧返回不同的值,并以完全随机的顺序获取它们。

这是数据库服务器比应用程序代码更好的东西。如果您需要(在页面的某个位置)以不同方式处理正确和错误的答案,则可以使用查询查询从基本查询中提取正确或不正确的答案。

答案 1 :(得分:1)

如果你真的想要排序和使用随机数组,像往常一样,Ben Nadel为我们完成了所有工作:

http://www.bennadel.com/blog/280-Randomly-Sort-A-ColdFusion-Array-Updated-Thanks-Mark-Mandel.htm

然后,您需要更改原始代码,以便在Duplicate中使用ArrayAppend功能来防止引用问题。所以改变这个:

PersonArray = arrayAppend(PersonArray , Person);

对此:

arrayAppend(PersonArray , Duplicate(Person));

ArrayAppend也会返回truefalse值,因此您将结果分配回数组会消除其中已有的信息。我总是把它和ListAppend混淆,它确实会返回修改后的列表。

PersonArray = arrayNew(1);

Person = structNew();
Person.PersonID = GetOneRight.PersonID;
Person.FirstName = GetOneRight.FirstName;
Person.LastName = GetOneRight.LastName;

ArrayAppend(PersonArray , Duplicate(Person));

for (i = 1; i lte GetTwoWrong.RecordCount; i++) {
    Person = structNew();
    Person.PersonID = GetTwoWrong.PersonID[i];
    Person.FirstName = GetTwoWrong.FirstName[i];
    Person.LastName = GetTwoWrong.LastName[i];
    ArrayAppend(PersonArray , Duplicate(Person));

}

//Now shuffle it using Ben's code
CreateObject("java", "java.util.Collections").Shuffle(PersonArray);