我正在使用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来检查答案的正确性(并存储选择)。
那么,我如何创建一个数组,然后从两个不同的查询中填充它然后对它进行排序?我应该使用阵列吗?结构?
答案 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
也会返回true
或false
值,因此您将结果分配回数组会消除其中已有的信息。我总是把它和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);