Как заполнить, а затем отсортировать или рандомизировать массив? - PullRequest
0 голосов
/ 04 октября 2011

Я использую 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>

Тогда мне нужно будет вывести ответы. Ответ будет кликабельным. При нажатии я отправлю PersonID через jQuery, чтобы проверить правильность ответа (и сохранить выбор).

Итак, как мне создать массив, а затем заполнить его из двух разных запросов и затем отсортировать? Должен ли я использовать массив вообще? Структура?

Ответы [ 2 ]

1 голос
/ 04 октября 2011

На тот случай, если вы действительно захотите отсортировать и использовать случайный массив, как обычно, Бен Надель сделал всю работу за нас:

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);
1 голос
/ 04 октября 2011

Я бы сделал это в базе данных, которая будет намного менее сложной. Вот пример:

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 и получать их в совершенно случайном порядке.

Это то, что серверы баз данных гораздо лучше, чем код приложения. Если вам нужно (где-то на странице) по-разному обращаться с вашими правильными и неправильными ответами, вы можете использовать Query of Query для извлечения только правильных или неправильных ответов из базового запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...