0

我以前制作了一个函数,每次当我使用 shuffle() 函数进行测验时,每次都会以一组新的顺序随机排列一组问题

原始数组 (Q1,Q2,Q3,Q4,Q5,Q6) 第一次给我 (Q2,Q4,Q1,Q3,Q6,Q5) 第二次给我 (Q3,Q4,Q2,Q6,Q1,Q5 ) 等等。每次都有新的问题。

这是仅适用于随机播放的功能代码

/**
 * Update user questions.
 *
 * @param $quiz_id
 * @param $course_id
 * @param $user_id
 */
public function update_user_questions( $quiz_id, $course_id, $user_id ) {
    global $wpdb;
    $item = null;

    switch ( current_action() ) {
        case 'pmi-course/user/quiz-redone':
            $item = $wpdb->get_row(
                $wpdb->prepare( "
                SELECT * FROM {$wpdb->prefix}pmicourse_user_items
                WHERE item_id = %d
                    AND user_id = %d
                    AND ref_id = %d
                ORDER BY user_item_id DESC
            ", $quiz_id, $user_id, $course_id )
            );
            break;
        case 'pmi-course/user/quiz-started':
            break;
    }
    if ( ! $item ) {
        return;
    }
    if ( ! $item->status == 'started' ) {
        return;
    }

    $random_quiz = get_user_meta( $user_id, 'random_quiz', true );
    $quiz        = LP_Quiz::get_quiz( $quiz_id );
    if ( $quiz && $questions = $quiz->get_questions() ) {
        $questions = array_keys( $questions );
        shuffle( $questions );
        $question_id = reset( $questions );

        // set user current question
        $user = pmi_course_get_current_user();
        $user_course = $user->get_course_data( $course_id );
        $item_quiz = $user_course->get_item($quiz_id);

        $item_quiz->set_meta( '_current_question', $question_id );
        $item_quiz->update_meta();

        pmi_course_update_user_item_meta( $item->user_item_id, 'current_question', $question_id );
        if ( empty( $random_quiz ) ) {
            $random_quiz = array( $quiz_id => $questions );
        } else {
            $random_quiz[ $quiz_id ] = $questions;
        }
        update_user_meta( $user_id, 'random_quiz', $random_quiz );
    }
}

/**
 * Random quiz questions.
 *
 * @param $quiz_questions
 * @param $quiz_id
 *
 * @return array
 */
public function random_questions( $quiz_questions, $quiz_id ) {

    if ( get_post_meta( $quiz_id, '_lp_random_mode', true ) == 'yes' ) {

        // get user meta random quiz
        $random_quiz = get_user_meta( get_current_user_id(), 'random_quiz', true );
        if ( is_admin() || empty( $random_quiz ) || empty( $random_quiz[ $quiz_id ] ) ) {
            return $quiz_questions;
        }
        $questions = array();
        if ( array_key_exists( $quiz_id, $random_quiz ) && sizeof( $random_quiz[ $quiz_id ] ) == sizeof( $quiz_questions ) ) {
            foreach ( $random_quiz[ $quiz_id ] as $question_id ) {
                if ( $question_id ) {
                    $questions[ $question_id ] = $question_id;
                }
            }
        } else {
            $question_ids = array_keys( $quiz_questions );
            shuffle( $question_ids );
            $random_quiz[ $quiz_id ] = $question_ids;
            $questions               = array();
            foreach ( $question_ids as $id ) {
                $questions[ $id ] = $quiz_questions[ $id ];
            }
        }

        return $questions;
    }

    return $quiz_questions;

}

这就是我试图从一组“6”个问题中随机抽取特定数量的问题,但它一次给出随机结果,而不是像 shuffle() 我知道 array_rand() 给出不同的值每次,但为什么不是我的情况。可能是我做错了什么。我已经放下了这两种情况,或者任何人都可以识别我做错了什么,或者解决方案可以扩展到更好。任何帮助,将不胜感激。

原始数组 (Q1,Q2,Q3,Q4,Q5,Q6) 第一次 (Q1,Q4,Q5,Q6) 第二次 (Q1,Q4,Q5,Q6) 第三次 (Q1,Q4,Q5,Q6) -- -我每次都想要不同的套装

我试图实现这一目标

///for first function 

if ( $quiz && $questions = $quiz->get_questions() ) {
$questions = array_rand( $questions , 4);
$question_id = reset( $questions );


///for second function

if ( array_key_exists( $quiz_id, $random_quiz ) && sizeof( $random_quiz[ $quiz_id ] ) < sizeof( $quiz_questions ) ) {
foreach ( $random_quiz[ $quiz_id ] as $question_id ) {
if ( $question_id ) {
$questions[ $question_id ] = $question_id;
}
}
} else {
question_ids = array_rand( $quiz_questions , 4);
$random_quiz[ $quiz_id ] = $question_ids;
questions               = array();
foreach ( $question_ids as $id ) {
$questions[ $id ] = $quiz_questions[ $id ];
}
}

4

1 回答 1

0

从数组中获取一组随机元素的简单函数:

$questions = array("Question 1","Question 2","Question 3","Question 4","Question 5","Question 6","Question 7","Question 8","Question 9","Question 10");

function shuffle_questions($questions, $num_questions){
    $random_questions = [];

    for($i = 0; $i < $num_questions){
        $random_num = rand(0, 9);
        $random_questions[] = $questions[$random_num];
    }

    return $random_questions;
}

如果您只希望它返回独特的问题(可能是您正在寻找的)

function shuffle_questions($questions, $num_questions){
    $questions_temp = $questions;
    $random_questions = [];

    for ($i = 0; $i++; $i < $num_questions){
        $key = array_rand($questions_temp, 1);
        $random_questions[] = $questions_temp[$key];
        $unset($questions_temp[$key]);
    }

    return $random_questions;
}
于 2018-09-28T19:18:31.763 回答