随机抽出特定数量的问题

I have function previously made which get me a set of questions array each time shuffled in a new set of order each time when i take a quiz with shuffle() function

  1. Original array (Q1,Q2,Q3,Q4,Q5,Q6)
  2. 1st time it gives me (Q2,Q4,Q1,Q3,Q6,Q5)
  3. 2nd time it gives me (Q3,Q4,Q2,Q6,Q1,Q5) and so on.

everytime a new set of questions.

This is the function code working for only for shuffle

    /**
     * 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;

    }

This is what i tried to pull out specific number of questions randomly like "4" questions out of "6" questions from a set but it gives the random result one time and not again like shuffle() i know array_rand() gives different value each time but why not in my case. may be i am doing something wrong . I have put down both the case either can anyone identify me what i am doing wrong or the solution could be extended to more better. Any help would be appreciated.

  1. Original array (Q1,Q2,Q3,Q4,Q5,Q6)
  2. First time (Q1,Q4,Q5,Q6)
  3. Second time (Q1,Q4,Q5,Q6)
  4. Third time (Q1,Q4,Q5,Q6) ---i want different sets for each time

What i tried to achieve this

///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 ];
}
}

</div>

if array_rand doesn't work the way you want. Try using shuffle then then slice the array to get a new array with 4 elements. See the sample below using your code

///for first function 

if ( $quiz && $questions = $quiz->get_questions() ) {
shuffle($questions);
$questions = array_slice( $questions ,0, 3);
$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 {
shuffle($quiz_questions);
question_ids = array_slice( $quiz_questions ,0, 3);
$random_quiz[ $quiz_id ] = $question_ids;
questions               = array();
foreach ( $question_ids as $id ) {
$questions[ $id ] = $quiz_questions[ $id ];
}
}

:

</div>