開発情報・ナレッジ

投稿者: 株式会社ゴンドラ 2026年2月26日 (木)

アンケートの「その他」を固定してシャッフルする方法

選択肢のシャッフルは、アンケートの回答バイアスを防ぐために有効な方法ですよね。
しかし単純にシャッフルしてしまうと、「その他」や「特にない」といった選択肢まで途中に混ざってしまい、
回答者が混乱する原因になります。

本記事ではアンケート作成の第二弾として、特定の項目だけを末尾に固定するカスタマイズをご紹介します。
第一弾はこちら

反映イメージ

デモサイトはこちら

上記デモサイトでは、リロードする度に「その他」以外の項目がシャッフルされます。

作業手順

処理コード

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の専門チームが要件定義から実装まで一貫してサポートいたしますので、まずはお見積もりをご依頼ください。

カスタマイズの見積もりを依頼する
解決しない場合はこちら コンテンツに関しての
要望はこちら