Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) 1 [2]  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Перемешать массив, и сохранить ключи
Hello  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 837
Пользователь №: 32378
На форуме: 4 года, 6 месяцев, 23 дня
Карма: 50




Цитата (mvg @ 30.12.2014 - 20:57)
1) Что если $key = array_rand($in) станет false до того как заполниться массив $result?
Т.е. я хотел сказать что алгоритм не оптимальный.

Ты программист или где?
while ( null !== ($key = array_rand($in)) ) {


--------------------
VPS от 5$, первые 2 месяца - бесплатно.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
savelikan  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 370
Пользователь №: 18633
На форуме: 7 лет, 3 месяца, 24 дня
Карма:




Хорошо, распишу всё по порядку.
Есть две программы тестирования: на "внешнее незавивимое тестирование" и другая - на "екзамен КРОК".

Начну с второй, потому, что она проще. Здесь все вопросы одного типа и 5 вариантов ответов. Здесь нужно максимальн быстродействие. А поиск в одной таблице - уже лучше, чем в двух. Да и работает - пускай работает.

А первый вариант поинтересней. Там ведь много типов вопроса: выбор одного верного ответа, больше одного, на установления соответствия и последовательности. Именно здесь база такая, как ты писал.
Вот база вопросов:
CREATE TABLE IF NOT EXISTS `zno_questions` (
`zno_questions-id` int(11) NOT NULL AUTO_INCREMENT,
`zno_questions-toppic` int(11) NOT NULL,
`zno_questions-type` int(11) NOT NULL,
`zno_questions-showtext` int(11) NOT NULL,
`zno_questions-text` text NOT NULL,
`zno_questions-img` varchar(200) NOT NULL,
`zno_questions-form` int(11) NOT NULL,
PRIMARY KEY (`zno_questions-id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `zno_questions` (`zno_questions-id`, `zno_questions-toppic`, `zno_questions-type`, `zno_questions-showtext`,
`zno_questions-text`, `zno_questions-img`, `zno_questions-form`) VALUES
(1, 1, 1, 0, 'Вопрос. Один верный ответ!', '', 0),
(
2, 1, 2, 0, 'Выберите несколько ответов', '', 0),
(
3, 1, 3, 0, 'Установите соответствия', '', 0);


А вот ответы
CREATE TABLE IF NOT EXISTS `zno_answers` (
`zno_answers-id` int(11) NOT NULL AUTO_INCREMENT,
`zno_answers-question` int(11) NOT NULL,
`zno_answers-answer` text NOT NULL,
`zno_answers-true` text NOT NULL,
`zno_answers-inf` int(11) NOT NULL,
PRIMARY KEY (`zno_answers-id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;


INSERT INTO `zno_answers` (`zno_answers-id`, `zno_answers-question`, `zno_answers-answer`, `zno_answers-true`, `zno_answers-inf`) VALUES
(1, 1, 'ответ 1', '', 0),
(
2, 1, 'ответ 2 верный', '1', 0),
(
3, 1, 'ответ 3', '', 0),
(
4, 1, 'ответ 4', '', 0),
(
5, 2, 'ответ 1', '', 0),
(
6, 2, 'ответ 2 верный', '1', 0),
(
7, 2, 'ответ 3 верный', '1', 0),
(
8, 2, 'ответ 4', '', 0),
(
9, 3, 'Ответ А', 'Верный ответ к А', 0),
(
10, 3, 'Ответ В', 'Верный ответ к В', 0),
(
11, 3, 'Ответ Г', 'Верный ответ к Г', 0),
(
12, 3, '', 'Лишний ответ Д', 0);


Задача: выбрать все ответы рандомно, потом ответы к ним. Одним запросом я это ну никак не могу сделать. Мало того, нужно еще и их сохранить!
ВОт как я выбираю вопрос:
"
SELECT *
FROM `zno_questions`
LEFT JOIN `zno_resultsinf` ON (`zno_resultsinf`.`zno_resultsinf-q` = `zno_questions`.`zno_questions-id`)
WHERE `zno_questions-toppic` = '".$TSTtoppic['zno_toppic-id']."' ".$search_if_saved."
ORDER BY `zno_resultsinf-id`,`zno_questions-form`, RAND()

Если вопросы не сохранены, тогда упорядочить рандомно.

И ответы
SELECT *
FROM `zno_answers`
LEFT JOIN `zno_resultsinf` ON (
`zno_resultsinf`.`zno_resultsinf-a1` = `zno_answers`.`zno_answers-id` AND
`zno_resultsinf`.`zno_resultsinf-res` = '".$TSTresults['zno_results-id']."'
)
WHERE `zno_answers-question` = ".$TSTquestion['zno_questions-id']."
ORDER BY `zno_resultsinf-id`, RAND()
LIMIT 10

Тоесть, если не сохранены - я их сохраню, а если уже сохранены - тогда упорядочить ответы и вопросы в таком порядке, как они сохранены.

Как сохраняется?
Вот таблица, где сохраняется оценка, и информация о тесте:
CREATE TABLE IF NOT EXISTS `zno_results` (
`zno_results-id` int(11) NOT NULL AUTO_INCREMENT,
`zno_results-user` int(11) NOT NULL,
`zno_results-toppic` int(11) NOT NULL,
`zno_results-d-start` datetime NOT NULL,
`zno_results-d-finish` datetime NOT NULL,
`zno_results-t-all` int(11) NOT NULL,
`zno_results-t-true` int(11) NOT NULL,
`zno_results-status` int(1) NOT NULL,
`zno_results-deleted` int(1) NOT NULL,
PRIMARY KEY (`zno_results-id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=41

А здесь сохраняется информация об ответах, вопросах, и что ответил пользователь (zno_resultsinf-val)
CREATE TABLE IF NOT EXISTS `zno_resultsinf` (
`zno_resultsinf-id` int(11) NOT NULL AUTO_INCREMENT,
`zno_resultsinf-res` int(11) NOT NULL,
`zno_resultsinf-q` int(11) NOT NULL,
`zno_resultsinf-a1` int(11) NOT NULL,
`zno_resultsinf-a2` int(11) NOT NULL,
`zno_resultsinf-val` varchar(200) NOT NULL,
PRIMARY KEY (`zno_resultsinf-id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1130 ;


ВОт так! Пожалуйста, обясните хотя бы на словах - что нужно изменить чтоб было на высшем уровне?


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
mvg  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 474
Пользователь №: 37895
На форуме: 3 года, 4 месяца, 3 дня
Карма: 22




Цитата
Ты программист или где?
<pre class="sh_sourceCode" rel="php"><span class="sh_control">while</span> <span class="sh_symbol">(</span> <span class="sh_keyword">null</span> <span class="sh_symbol">!== (</span><span class="sh_variable">$key</span> <span class="sh_symbol">=</span> <span class="sh_function">array_rand</span><span class="sh_symbol">(</span><span class="sh_variable">$in</span><span class="sh_symbol">)) )</span> <span class="sh_cbracket">{</span></pre>


Я - где :lol: .

Проверяю ваш алгоритм! Допустим:

while ( null !== ($key = (array_rand($in) === ($in[1]))) ) {unset($in[1])}
while ( null !== ($key = (array_rand($in) === ($in[3]))) ) {unset($in[3])}
while ( null !== ($key = (array_rand($in) === ($in[1]))) ) {null}

В такой ситуации элементы массива $in с номерами 2 и 4 останутся не у дел, а массив $result в который скопируется в $in будет состоять только из 1 и 3 элементов.

Таким образом элементы массива $in с номерами 2 и 4 потерялись в перемешивании.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) 1 [2]  Ответ в темуСоздание новой темыСоздание опроса