選択肢のシャッフルは、アンケートの回答バイアスを防ぐために有効な方法ですよね。
しかし単純にシャッフルしてしまうと、「その他」や「特にない」といった選択肢まで途中に混ざってしまい、
回答者が混乱する原因になります。
第一弾はこちら
反映イメージ
デモサイトはこちら上記デモサイトでは、リロードする度に「その他」以外の項目がシャッフルされます。
作業手順
処理コード
PHPを使用するページには、以下の専用タグをHTMLコメントとして記述する必要があります。
<?php // <!-- SMP_DYNAMIC_PAGE DISPLAY_ERRORS=OFF NAME=SAMPLE --> ?>
また、SPIRALではshuffle関数の使用ができないため以下のように記述します。
▼コードを
<head>タグの中に設置してください。
<?php //<!-- SMP_DYNAMIC_PAGE DISPLAY_ERRORS=ON NAME= shuffle SAMPLE--> ?>
<?php
//エスケープ用の関数
function h($str){
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
// 通常の選択肢を配列で定義(その他以外)
$normal_options = [
['value' => '1', 'text' => '回答1', 'checked' => '$fixTest:1$'],
['value' => '2', 'text' => '回答2', 'checked' => '$fixTest:2$'],
['value' => '3', 'text' => '回答3', 'checked' => '$fixTest:3$'],
['value' => '4', 'text' => '回答4', 'checked' => '$fixTest:4$'],
];
// その他の選択肢(固定)
$other_option = ['value' => '5', 'text' => 'その他', 'checked' => '$fixTest:5$'];
// 通常の選択肢のみをシャッフル(手動処理)
$count = count($normal_options);
for ($i = $count - 1; $i > 0; $i--) {
$j = mt_rand(0, $i);
// 配列の要素を交換
$temp = $normal_options[$i];
$normal_options[$i] = $normal_options[$j];
$normal_options[$j] = $temp;
}
// シャッフルされた通常の選択肢とその他の選択肢を結合
$options = array_merge($normal_options, [$other_option]);
?>
※ 変更が必要な部分
・「回答1~4」「その他」部分は、表示させたい選択肢の名称に変更してください。
・「$fixTest:1$」部分は、選択肢の差し替えキーワードに変更してください。
出力用コード
以下のように置き換える
▼変更前
<ul class="cf"> <li><label><input class="input" type="checkbox" value="1" name="shuffleTest" $shuffleTest:1$><span>回答1</span></label></li> <li><label><input class="input" type="checkbox" value="2" name="shuffleTest" $shuffleTest:2$><span>回答2</span></label></li> <li><label><input class="input" type="checkbox" value="3" name="shuffleTest" $shuffleTest:3$><span>回答3</span></label></li> <li><label><input class="input" type="checkbox" value="4" name="shuffleTest" $shuffleTest:4$><span>回答4</span></label></li> <li><label><input class="input" type="checkbox" value="5" name="shuffleTest" $shuffleTest:5$><span>回答5</span></label></li> </ul>
▼変更後
<ul class="cf">
<?php foreach ($options as $option): ?>
<li>
<label>
<input class="input" type="checkbox"
value="<?php echo h($option['value']); ?>"
name="fixTest"
<?php echo $option['checked'];?>>
<span><?php echo h($option['text']); ?></span>
</label>
</li>
<?php endforeach; ?>
</ul>
※ 変更が必要な部分
・name値の部分は、自身で設定したフィールドの差し替えキーワードに変更してください。
まとめ
・「シャッフルする項目」と「固定する項目」を分けて処理するのがコツです
・HTML側をループ処理にすることで、項目数が増減しても柔軟に対応可能です
【お知らせ】本実装の構築代行・カスタマイズを承ります
記事でご紹介した内容や、貴社の要件に合わせた柔軟なカスタマイズ開発を承っております。
SPIRALの専門チームが要件定義から実装まで一貫してサポートいたしますので、まずはお見積もりをご依頼ください。