質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

「ランダム」で「重複しない値」を「ループの中で」出力したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 359

makirons

score 14

PHPでランダムで重複しない値を、ループの中で出力したいと考えております。
お詳しい方がいらっしゃいましたら、ご意見宜しくお願い申し上げます。

実現したいこと

次の《出力コード》にありますように、ループの中の<li><?php echo rendseven();?>と書くことによって、ランダムな1から7の値を、重複せずに出力したいと考えております。

そこで後述の《関数コード》を作ってみたのですが、これでは値が重複してしまうようで…ここから先に進めません。

どのようにしたら重複させることがなくなるか、どなたか良い方法をご教授願えればと思い質問させて頂きました。

《出力コード》

<?php if(have_posts()): while(have_posts()):the_post(); ?>

<li class="no-<?php echo rendseven();?>">
<?php the_title(); ?>
</li>

<?php endwhile; endif; ?>

《関数コード》

<?php // 1から7の重複しないランダム番号を返す
function rendseven (){

    // 整数値を配列に入れる
    $ar_num = range(1,7);

    // その配列をランダムに並び替える
    shuffle($ar_num);

    // 表示したい数分、配列の要素の値を取ってくる
    for ($i = 0 ; $i < 1 ; $i++){
        return $ar_num[$i];
    }
}
?>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

makironsさん
実装的には重複しないように見えます。
実際手元で確認してみましたが、重複しないようでした。
なので、phpのコードでは、「1から7の重複しないランダム番号を返す」が実現できていると思われます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/02 20:20 編集

    《関数コード》の中だけで出力していませんか?

    《出力コード》のように出力し、外から《関数コード》を呼べば重複すると思いますが…

    キャンセル

  • 2018/12/02 21:20

    makironsさん
    ああ!すみません、そういう意味ですね。何度も呼び出したときに重複してしまうと。
    解決できてよかったです^^

    キャンセル

  • 2018/12/02 21:23

    いえいえ、よく見直すきっかけになりました。感謝しております。

    キャンセル

+1

function rendseven (){
    $ar_num = range(1,7);
    shuffle($ar_num);
    for ($i = 0 ; $i < 1 ; $i++){
        return $ar_num[$i]; // return しているので1回目に関数が終わる。2回同じ関数を呼んでも$ar_numが引き継がれるわけではないのでばらばら。
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/02 20:59

    ご説明ありがとうございます。

    関数がはじめから実行されてしまうために、「➀1から7をランダムにした上で、➁その中から選ぶ」の➁が繰り返されるではなく、➀➁が毎回繰り返されてしまうということでしょうか?

    文脈によれば「returnがいけないように察せられますが、では…??となります。

    もう少しわかりやすく教えてもらえませんか?

    キャンセル

  • 2018/12/02 21:13

    自己解決としてコードを書いてみたのですが、kei344様が言わんとしておられたことはこれであっていますか?

    キャンセル

  • 2018/12/02 21:20

    「関数の使い方が間違っている」という回答です。

    キャンセル

  • 2018/12/02 21:22 編集

    「returnが間違っている」ではなく「関数の使い方が間違っている」と仰ったのですね。理解の浅いままの返信で大変失礼致しました。

    キャンセル

check解決した方法

0

関数でなく配列だけ作っておき、出力時にはその配列を重複しないように連番にすることで解決致しました。

georgen様、kei344様、ご協力頂き感謝致します。

<?php // 1から7のランダム配列を作る
$rand_ar = range(1 , 7);
shuffle($rand_ar);
?>

<?php if(have_posts()): ?>

<?php $count=0; // 連番を作る ?>

<?php while(have_posts()):the_post(); ?>

<li class="no-<?php echo $rand_ar[$count];?>">
<?php the_title(); ?>
</li>

<?php endif; ?>

<?php $count++; // 連番の値を増やす ?>

<?php endwhile; ?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る