PHP配列出力についての質問

このQ&Aのポイント
  • PHPの配列の出力について質問があります。配列に格納されたひらがなから重複せずに5つを選び出したいのですが、現在のコードでは重複が起きてしまうようです。
  • 具体的には、選出された要素が2度選ばれてしまった場合に、やり直しできるのか疑問です。
  • 解決策がなく、現時点では出力する環境がないため、アドバイスをいただきたいと思っています。初心者なので、指摘やアドバイスをお願いします。
回答を見る
  • ベストアンサー

PHPの配列の出力について

$loop = 5; $count = 0; while($count < $loop){ mt_srand(microtime() * 100000); $rand_key = rand(0,9); if (in_array($rand_key, $yomi)){ $count--; continue; } echo $yomi[$rand_key]\n; } 配列($yomi)に格納されたひらがなから5つ重複させずに選び出したいのですが、 randで選出された「りんご」が2度選び出された場合、これでやり直しされますか? 現在出力出来る環境がありません… 初心者ですので指摘やアドバイス等いただけると嬉しいです。 よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

全然ダメですね。 まず、終了条件をみたすことがないのでこのプログラムは終了しません。 $count < $loopが終了条件ですが、$count--はあっても$count++が無いので、このプログラムは終了条件をみたすことはありません。(まあ、あえてあるとしたらinteger overflowで符号が逆転した時でしょうが...) 終了条件という点で言うと、重複を許さず選択するということなので$loopよりも$yomiの要素数が少ないと無限ループに陥るのでそのチェックをしたほうがベターです。 また、in_arrayの使い方もおかしいです。 上記のin_arrayでは$rand_keyが$yomiに含まれるか調べていますが、調べるべきは$yomiではなく既に選ばれたかどうかでしょう。その場合も$count--するのは間違っています。 さらに、この方向でプログラムを書くとしたら、次の2点を満たしてないとダメですね。 1. $rand_keyが使われたことを示す配列を作る 2. 表示した時だけ$countの値を増やす。選ばなかったらカウントアップしなければいいだけなので、$countから値を引く必要は全くないと思います。 あと、細かいことですがmt_srandの使い方も変です。PHP 4.2.0以降ではmt_srandは不要になりましたし、mt_srandを使うなら、乱数を取り出すにはmt_randだと思います。 http://php.net/manual/ja/function.mt-srand.php という点を考えて書きなおすとこんな感じです。 if (count($yomi) > $loop) { $selected_keys = array(); while ($count < $loop){ $rand_key = mt_rand(0, count($yomi) - 1); if (in_array($rand_key, $selected_keys)) { continue; } array_push($selected_keys, $rand_key); $count++; echo $yomi[$rand_key]."\n"; } } else { echo "Error: cannot choose yomi for $loop times.\n"; } 選択した$rand_keyは$selected_keysに入れておき、後でチェックしています。また、mt_randは端点を含むのでcount($yomi) - 1となっています。ちなみに、countとは配列の要素数を数える関数です。 http://php.net/manual/ja/function.mt-rand.php http://jp1.php.net/manual/ja/function.count.php 元のやつだとn個からn個の要素を取る場合でnがある程度大きいと、何度も次のところを実行して空振りし続けるので、自分だったら別のやり方でやります。 | $rand_key = mt_rand(0, count($yomi) - 1); | if (in_array($rand_key, $selected_keys)) { | continue; | } $loopが要素数以上かのチェックは省略しました。$yomiのコピーを作って、出力するたびにそれを配列から消していきます。これだとそもそも配列には前回選んだものは含まれないのでin_arrayのチェックをする必要はありません。 $yomi_copy = $yomi; // make clone of $yomi. for ($count = 0; $count < $loop; $count++) { $rand_key = mt_rand(0, count($yomi_copy) - 1); echo "$yomi_copy[$rand_key]\n"; array_splice($yomi_copy, $rand_key, 1); } ちなみに、PHPでは配列を代入すると配列のコピーができるので、$yomi_copyをいくらいじっても元の$yomiには影響を与えません。 また、array_spliceというのは配列の一部の要素を切り取る命令です。 http://php.net/manual/ja/function.array-splice.php

padora
質問者

お礼

お早い回答ありがとうございます。 加算するのは忘れてました! 色々と勉強不足ですみません… 回答してくださったものを元にやってみます! ありがとうございました!

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

シャッフルして前から5個取り出せばよいのでは?

padora
質問者

お礼

すみませんありがとうございます! 別の形で取り入れさせて頂きました!

関連するQ&A

  • PHP ランダムループへのラジオボタン付加

    $loop = 3; $count = 0; if (count($mondai) > $loop) { $selected_keys = array(); while ($count < $loop){ $hazure_key = mt_rand(0, count($mondai) - 1); if (in_array($hazure_key, $selected_keys)) { continue; } array_push($selected_keys, $hazure_key); $mondai_hyouji[$count] = $mondai[$hazure_key]; $count++; } } $mondai_hyouji[3] = $mondai[$seikai_key]; $numbers = range(0, 3); shuffle($numbers); foreach ($numbers as $number){ echo "$mondai_hyouji[$number]"; } 問題の不正解を複数呼び出し、正解を1つ呼び出してシャッフルして表示させています。 これらにラジオボタンを付けたいと思ったのですが文法エラーになってしまいます。 上記のコードに付け加えるのは難しいでしょうか?

    • ベストアンサー
    • PHP
  • よく使われてるPHPランダム広告について。

    よく使われてる(ネット上で見かける)PHPランダム広告についてですが、 // 初期化 srand((double)microtime()*1000000); $ad_list1 = file($absolute_path."/modules/ads/ads_01.txt"); $ad_key1 = array_rand($ad_list1, 2); // 広告の表示 $ad1 = $ad_list1[$ad_key1[0]]; 1.現在でも、srand関数を使う必要がありますか? 2.広告の表示は1つなのですが、array_rand($ad_list1, 2);の変数以外の部分の引数を1もしくは、何も書かない場合は広告が表示しないのは、何故なのでしょうか。2を書かないとだめで。。。 ちなみに、ads_01.txtの内容は、2行。 <a href=""><img src="" alt="" /></a> <a href=""><img src="" alt="" /></a> (""の内容は省略しています。) 色々調べたり、試しましたが、Xでした。。。 みなさん、ご回答いただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのrange関数

    以下のような記述をしました。 $range = range(54,200); $rand = array_rand($range,5); foreach ($rand as $key => $value) { echo $value. '<br />'; } echo '<br />'; rangeで範囲指定しているはずなのに、おもいっきり範囲外(54以下)の値がでます・・・。 書き方が間違っているのでしょうか?

    • ベストアンサー
    • PHP
  • 配列の次元を超えてランダムに選択したい

    PHP5.2.4を使用しています。 例えば、次のような2次元以上の配列があったときに $arr[0][0] = array('a' => 1, 'b' => 11); $arr[0][1] = array('a' => 2, 'b' => 5); $arr[0][2] = array('a' => 3, 'b' => 20); $arr[1][0] = array('a' => 4, 'b' => 3); $arr[1][1] = array('a' => 5, 'b' => 30); この5つから、'b'の値が10以上の候補だけのインデックス($arr【[1][1]】←この部分)を ランダムに1つ選ぶ方法はどのようになるのでしょうか? 自分が考えたのは for ($i = 0; $i < count($arr); $i++) {  for ($j = 0; $j < count($arr[$i]); $j++)  {   if ($arr[$i][$j]['b'] < 10)    continue;   $new_arr[] = array('index2' => $i, 'index1' => $j);  } } $key = array_rand($new_arr, 1); print_r($new_arr[$key]); //Array ( [index2] => 0 [index1] => 0 ) //Array ( [index2] => 0 [index1] => 2 ) //Array ( [index2] => 1 [index1] => 1 ) //いずれかが選択される なんですが、これだとあまり良いやり方だと思わなくて なにか別のやり方はあるのでしょうか?

    • 締切済み
    • PHP
  • 画像読み込みとランダム表示について。。。

    (まえおき)PHPを最近始めましたがちんぷんかんぷんで非常に困っています!とりあえずやってみよう!と分からないなりに進めてきましたが限界があり、脳細胞が溶けて死んでしまいそうなので質問させて頂きます。 (本題)Dream Weaverで簡単なウェブページを作成中です。画像を3枚ぐらいをランダム表示させようと進めています。 (疑問1)SQLが使えないのでDream Weaver内の同列に画像ファイルを作り、そこから読み込めるようにしようと考えましたが、可能なのでしょうか? (疑問2)<?php srand((float) microtime() * 10000000); $input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank"); $rand_keys = array_rand($input, 2); echo $input[$rand_keys[0]] . "\n"; echo $input[$rand_keys[1]] . "\n"; ?> ↑上記のサンプルを手にいれたので $input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank"); のNeo Morpheus Trinity Cypher Tank の箇所に画像を入れたらいけるのでは?と思い image/photo.jpg.... と記入していきましたがエラーになってしまいました。どうやったらテキストの代わりに画像入れられるのでしょうか?? (締め)基本をあまり理解していませんのでとんでもなく意味不明な質問なのかもしれませんが、どうぞお助けください。お願いします。。。 

    • ベストアンサー
    • PHP
  • ある文字を含む文字列のみ配列にする方法

    var_dump($text); を行うと array(1) { [0]=> string(XX) "あいさつ" } array(1) { [0]=> string(XX) "いい日旅立ち" } array(1) { [0]=> string(XX) "りんご、うまい" } array(1) { [0]=> string(XX) "メロン好き" } …… となるような変数 $text があり、そこから $key = array("ばなな","りんご","メロン"); の配列内にある文字列を含むものだけを新たに格納したいです。 自分では foreach($text as $value){ if(in_array($value, $key)){ $key_text[] = $value; } } と書いて試したのですが、NULLと返ってきてしまいます。 どうやって書けばいいか教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • php 外部ファイルについて

    php初心者です。 テキスト表示でランダムリンクをしたいのですが リンク先のURLとテキストを外部ファイルにしたいのです。 現在------------------------ <?php srand((double)microtime()*1000000); $ad_list1 = file("20.txt"); $ad_key1 = array_rand($ad_list1, 2); $ad1 = $ad_list1[$ad_key1[0]]; // 表示 echo "ID=$ad1"; ?> ----------------------------- ↑このphpソースを組み入れ、外部ファイル20.txtには ----------------------------- <a href="http://domain.jp/?id=111">111</a> <a href="http://domain.jp/?id=222">222</a> <a href="http://domain.jp/?id=333">333</a> ・ ・ ------------------------------ という感じでリンク先URLを1行ずつ書いています。 テキスト表示は ID=111 という感じで表示されるようにはなったのですが phpソースの中に http://domain.jp/? までを組み込んで、外部ファイルの内容を ------------------------------ 111 222 333 ・ ・ ------------------------------ とするだけで、 表示される ID=111をクリックすると http://domain.jp/?111 のページが表示されるようにするには どうすれば良いのでしょうか。 また、そういった事は可能でしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Perl内でPHPの出力結果を表示したい

    Perl製のCGI内で、PHP製のランダムバナー表示CGIを呼ぼうとしたのですが、下記のようなエラーが出てしまいました。 いろいろ試行錯誤したのですが、お手上げです。 どのように修正したらよいでしょうか? なお、ランダムバナー表示CGI 単体だけを実行したときは、正常に表示されています。 [index.cgi]  #!/usr/local/bin/perl  print "Content-type: text/html\n\n";  print "<HTML>\n<BODY>\n\n";  $ImgFileName="./ad.php";  open(IN, "$ImgFileName |");  while (<IN>) {    $str=$str.$_;  }  close(IN);  print $str; [ad.php]  <?php  $_1 = ('<img src="http://example.jp/a.gif">');  $_2 = ('<img src="http://example.jp/b.gif">');  $img_arry = array("$_1","$_2");  srand((double)microtime()*1000000);  $num =array_rand($img_arry);  $image = $img_arry[$num];  echo "$image";  ?> [表示された内容] ./ad.php: ?php: No such file or directory ./ad.php: line 2: syntax error near unexpected token `('' ./ad.php: line 2: `$_1 = ('【a.gifの画像】);'

  • 時間が経つと表示文字が変わる構文

    PHPの含まれた会社のホームページで、 急遽変更しなくてはならない部分が出たのですが、 担当する人が体調を崩してしまいました。 そこで、少々HTMLをかじった程度の素人である私が 対応しなくてはいけなくなったのですが、 マニュアルを見ても記述方法を見つける事が出来ない為、 こちらで質問させて頂きました。 行いたいのは下記のような表示方法です。 ・6時~11時59分は「おはようございます」と表示 ・12時~17時50分は「こんにちは」と表示 ・18時~翌朝5時59分は「こんばんは」と表示 現在は、「おみくじ」が表示されるようになっています。 ここを、上記の表示方法に変えたいのですが。 記述方法は下記の通りです。 <?php srand ((float) microtime() * 10000000); $omikuji = array ( "大吉", "中吉", "吉", "凶" ); $rand_keys = array_rand($omikuji, 2); ?> <input name="omikujifield" type="text" value=<? echo $omikuji[$rand_keys[0]] ?> size="50"> これを、上記の「あいさつ」に変更したいです。 それでは何卒宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • phpが動きません

    <SCRIPT LANGUAGE="PHP"> // Copyright (C) 2001-2004 All right reserved by Shinya Kondo ( CGI KON ) // 検索用関数 Function Search_Pattern($record,$pattern) { for($loop = 0;$loop < count($pattern);$loop++) { if($pattern[$loop] == "") continue; if(!ereg($pattern[$loop],$record)) return 0; } return 1; } // メインプログラム if($search) { if(!$keyword) { $error = "キーワードが入力されていません"; $search = ""; } } if($search) { $fp = @fopen("search_csv.csv","r"); if(!$fp) { $error = "該当ファイルを参照できません"; $search = ""; } } </SCRIPT> <HTML> <HEAD> <META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP"> <TITLE>ファイル簡易検索</TITLE> </HEAD> <BODY> <B>ファイル簡易検索</B> <BR> <CENTER> <FORM ACTION="search_csv.php" METHOD="post"> <INPUT TYPE="hidden" NAME="search" VALUE="検索する"> キーワード: <INPUT TYPE="text" NAME="keyword" VALUE="<? echo $keyword; ?>" SIZE="30"> <INPUT TYPE="submit" NAME="search" VALUE="検索する"> </FORM> <FONT COLOR="#FF0000"><? echo $error; ?></FONT> <HR> <P> <SCRIPT LANGUAGE="PHP"> if($search) { echo "<TABLE BORDER=1>\n"; while(!feof($fp)) { $buff = fgets($fp,255); $title .= $buff; if(ereg("\n",$buff)) break; } $title = ereg_replace("\x0A","",$title); $column = split(",",$title); echo "<TR>\n"; for($loop = 0;$loop < count($column);$loop++) { echo '<TD BGCOLOR="#00FFFF" NOWRAP>',$column[$loop],"</TD>\n"; } echo "</TR>\n"; $keyword = ereg_replace(" "," ",$keyword); $pattern = split(" ",$keyword); while(1) { $line = ""; while(!feof($fp)) { $buff = fgets($fp,255); $line .= $buff; if(ereg("\n",$buff)) break; } if($line == "") break; if(!Search_Pattern($line,$pattern)) continue; $line = ereg_replace("\x0A","",$line); $column = split(",",$line); echo "<TR>\n"; for($loop = 0;$loop < count($column);$loop++) { echo "<TD>",$column[$loop],"</TD>\n"; } echo "</TR>\n"; } fclose($fp); echo "</TABLE>\n"; } else { echo "キーワードを入力し、検索ボタンを押すと検索結果がここに表示されます。\n"; } </SCRIPT> <P> <FONT SIZE=2><I> Copyright (C) 2001-2004 All right reserved by <A HREF="http://cgikon.com">CGI KON</A> </I></FONT> </CENTER> </BODY> </HTML> フリー配布のphpをチェックしているのですが、なぜかこのphpだけ動きません。 csvファイル名もそのままでftpにあげています。 他のphpは問題なくうごいているのですが、原因がわかりません。 ご教授願います。

    • 締切済み
    • PHP