7

以下を使用して、重複のないランダムな質問のセットを選択しています。

<?php
$amount = get_field('select_number_of_questions');
$repeater = get_field("step_by_step_test");
shuffle($repeater);
$repeater_limit = array_slice($repeater,0,$amount);
foreach($repeater_limit as $repeater_row) {
    echo "<p>".$repeater_row['question']."</p>";
    $rows = $repeater_row['answer_options'];
    foreach($rows as $row) {
        echo $row['answer']."<br />";
    }
}
?>

各質問にはフィールドがあります:get_field('required_question');それはyes/noドロップダウンを持っています。はいを選択した質問は、常に上記のループに組み込む必要があります。

たとえば、テストには20の質問から選択でき、10の質問がランダムに選択されます。20の質問の中に、2つの必須の質問があります(つまり、これらは常に選択されます)。したがって、2つの必須の質問を取得し、他の8つのランダムな質問を選択する必要があります。

ランダムな選択に必要な質問を含めるにはどうすればよいですか?

4

2 に答える 2

3

まず、次のような必要な質問を除外する必要があります。

$all_questions = get_field("step_by_step_test");
$required = $optional = array();
foreach($all_questions as $question) {
    if( $a['required_question']) $required[] = $question;
    else $optional[] = $question;
}
$amount = get_field("select_number_of_questions")-count($required);
shuffle($optional);
$final = array_merge($required,array_slice($optional,0,$amount));
foreach($final as $repeater_row) {
    ...
}

私がまたあなたを助けたことを願っています:p

于 2013-03-26T16:11:11.287 に答える
3

質問にはそれが記載されていませんが、これはリピーターアドオンを使用して設定された高度なカスタムフィールドであることを示唆しています。

その場合、これは私が行ったテスト構成です。

acf config

ここで$repeater_row['title']は、OPの代わりに使用していることに注意してください$repeater_row['question']。また、answer_options部品を取り外しました。詳細についてはコメントを参照してください。

// Get fields
$amount = get_field( 'select_number_of_questions' );
$repeater = get_field( 'step_by_step_test' );

// Auxiliary arrays to separate fields by Field Name
$not_enabled = array();
$enabled = array();

// Separate
foreach( $repeater as $field )
{
    if( 'no' == $field['enabled'] )
        $not_enabled[] = $field;
    else
        $enabled[] = $field;
}

// Discount the enabled from the the total amount
$amount = (int)$amount - count( $enabled );

// Shuffle before slicing
shuffle( $not_enabled );
$repeater_limit = array_slice( $not_enabled, 0, $amount );

// Add enabled fields and shuffle again
$final_array = array_merge( $repeater_limit, $enabled ); 
shuffle( $final_array );

foreach( $final_array as $repeater_row ) {
    echo "<p>" . $repeater_row['title'] . "</p>";
}
于 2013-04-03T15:21:17.027 に答える