知り合いからもらったtxtファイルのランダム表示ソースの解説

このQ&Aのポイント
  • 知り合いからもらったtxtファイルのランダム表示ソースの解説
  • ソースを用意して指定のディレクトリにtxtファイルをアップすることでランダムに表示される
  • 連絡が取れなくなった人からもらったtxtファイルの解説を求める
回答を見る
  • ベストアンサー

解説お願いします。

知り合いからソースをもらったtxtファイルのランダム取得なのですが どういう動きをしているのかさっぱりなので誰か解説をお願いします。 このソースをくれた人に聞けば早いのですが連絡が取れなくなってしまったので^^; //index側のソース //ランダム表示 $sorce_dir = './hide_pc/rand_index_top'; @include_once('./hide_pc/randam_k.php'); } //./hide_pc/randam_k.php側のソース <?php //$sorce_dir ソースの入ったディレクトリ mt_srand((int)(microtime() * 10000)); $rand_text = array(); $i = 1; if ($handlerDir = opendir($sorce_dir)){ while ($filename = readdir( $handlerDir )){ if ( $filename != "." && $filename != ".."){ array_push($rand_text,$filename); $i++; } } } $rand = mt_rand(0,(count($rand_text) - 1)); $randam_sorce = file_get_contents($sorce_dir.'/'.$rand_text[$rand]); ?> このソースを用意して./hide_pc/rand_index_topのディレクトリにtxtファイルをアップすれば<?=$randam_sorce ?>と指定したところに表示されます 解説よろしくお願いいたします。

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

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

  • ベストアンサー
  • koke29
  • ベストアンサー率58% (114/196)
回答No.2

私は乱数は扱ったことが無いので、たぶん…の返答ですが このコードは複数向きでは無いと思いますよー $rand の値は常に範囲内のどれか一つの数字になりますから 例えばこれをもう一つ($rand2とかにして)実行するのは出来ますが 単純に処理すると$rand と $rand2 が同じ値になる可能性もあります で、乱数に疎い私が複数表示に挑むとしたら 配列番号を指定するための配列を作成して、その値をシャッフルしてから 表示に使う という方法をとるだろうと思います 大した量でも無いのでズバリ書いちゃうと $rand_text = array(); $rand = array(); $cnt = 0; $i = 1; if ($handlerDir = opendir($sorce_dir)){ while ($filename = readdir( $handlerDir )){ if ( $filename != "." && $filename != ".."){ array_push($rand_text,$filename); array_push($rand,$cnt); $cnt++; } } } shuffle($rand); $randam_sorce0 = file_get_contents($sorce_dir.'/'.$rand_text[$rand[0]]); $randam_sorce1 = file_get_contents($sorce_dir.'/'.$rand_text[$rand[1]]); これで<?=$randam_sorce0 ?>と<?=$randam_sorce1 ?>は違うものが 出るはずです ※$iを利用してもよいのですが、他の部分で使っている可能性が なきにしもあらずなので新しい変数$cntを追加してます 再度も言いますが、私は乱数には疎いので、mt_rand関数を使いながら もっと効率よく複数表示を実現する方法があるかもしれませんので 鵜呑みにはしないで下さいね(これも一つの方法という程度にして下さい)

petaturu
質問者

お礼

回答ありがとうございます。 こちらを参考に…というかそのまま使って動作確認をさせていただこうと思います。

その他の回答 (1)

  • koke29
  • ベストアンサー率58% (114/196)
回答No.1

//./hide_pc/randam_k.php側のソース で、わかる範囲で。 (間違いがあったら、どなたかご指摘頂けると助かります) <?php // 乱数ジェネレータの初期化 mt_srand((int)(microtime() * 10000)); // 空の配列を用意…指定ディレクトリ内のファイル名を格納する用 $rand_text = array(); // 変数の用意…今回の場合、謎(件数カウントして後で使うのかな?) $i = 1; // 1「もし$sorce_dirのディレクトリハンドル オープンに成功したら」 if ($handlerDir = opendir($sorce_dir)){ // 2「エントリの件数分、読み込みを繰り返して$filenameに代入してね」 while ($filename = readdir( $handlerDir )){ // 3「$filenameが『.』または『..』じゃなかったら」 if ( $filename != "." && $filename != ".."){ // 「配列 $rand_textに$filenameを格納してね」 array_push($rand_text,$filename); // 「最後に$iの値を+1してね」 $i++; } // 3の処理閉じ } // 2の処理閉じ } // 1の処理閉じ // 0~配列$rand_textの件数-1までの範囲で乱数を作る $rand = mt_rand(0,(count($rand_text) - 1)); /* -1するのは、配列の順番を指定する際のキーが「0」スタートだから。 「a,b,c,d,e」という値が配列に入っていたとすると 「0,1,2,3,4」がキーの値となります、キー2を指定→cとなる */ // $randam_sorceに配列$rand_textの$rand番目を読み込んだファイルを代入 $randam_sorce = file_get_contents($sorce_dir.'/'.$rand_text[$rand]); /* $rand(配列のキー)が4の場合、↑の説明でいくと $rand_textではeを読み込むことになります */ サッパリわからん…だったらスミマセン。

petaturu
質問者

お礼

解説ありがとうございます! どういう動きをしているのかはなんとなく把握できました。 しかしこれを理解して同じプログラムで複数箇所貼り付けれるプログラムにしたかったのですが自分にはレベルが高そうですorz

関連するQ&A

  • array_randを使いたい?

    phpでarray_randを使ってCSVのデータをランダム表示させたいです。 phpの知識がなくどのようにすればいいかわかりません。 CSVは id,商品名,説明文,価格,画像URL,リンク先URL, こんな感じになっています。 いろいろと調べてランダムにするにはarray_randを使えばいいのがわかったのですが、どのようにPHPを書けばいいかわかりません。 すいませんが、詳しく教えていただけないでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP
  • ランダム表示文字について

    if ( open( IN,"hoge.txt" ) ) {   @line = <IN>;   close( IN ); } else {   exit; } $random1 = @line[rand(@line)]; $random2 = @line[rand(@line)]; $randam3 = @line[rand(@line)]; テキストファイルから1行文字をランダムに表示するプログラムを書き実行できたのですが、このままだとrandom1,2,3の変数に同じものが入ってしまう可能性があります。 これで全て違うものが入るようなプログラムを書きたいのですが、そのようなことは可能でしょうか?

    • ベストアンサー
    • CGI
  • フォルダ内のHTMLにランダムに飛ばす

    以下のソースでadsフォルダ内にあるhtmlファイルを ランダムに呼び出しているのですが 実行をすると正常に表示をするときと ページが真っ白で何も表示しないときがあり困っています。 どなたかどこに問題があるか分かる方宜しければ 教えて頂けないでしょうか。 宜しくお願い致します<(_ _)> (ソース) <?php $dir_name = "ads"; $ads = array(); $dh = opendir($dir_name); while ($data = readdir($dh)) { if (!is_dir($data)) { array_push($ads, $data); } } closedir($dh); shuffle($ads); include("$dir_name/$ads[0]"); ?> (プログラムの目的) adshuffle.phpにアクセスするとadsフォルダ内にあるhtmlを ランダムに読み込む。 (階層) |_adshuffle.php |_ ads  |_ 001.html  |_ 002.html  |_ ・  |_ ・  |_ ・  |_ 999.html *最終的な目的は999までhtmlを増やしていく予定です。

    • ベストアンサー
    • PHP
  • phpでランダムにページを表示

    001.html~999.htmlの内容をランダムにPHPを使用しページを 表示させたいのですが以下のソースでは01.html表示になり 困っています。 <?php $dir_name = "ads"; $ads = array(); $dh = opendir($dir_name); while ($data = readdir($dh)) { if (!is_dir($data)) { array_push($ads, $data); } } closedir($dh); shuffle($ads); include("$dir_name/$ads[0]"); ?> どのようにすれば001になるのでしょうか、 どなたかご教示お願い致しますm(_ _)m

    • ベストアンサー
    • PHP
  • HYMLファイルの書換えに伴う文字化け

    質問させて下さい。 共有サーバーで複数のドメインを管理・運営しており、各ドメインのindex.htmlの内容を書換えたいと考えております。 サーバーのディレクトリ構造はこんな感じ。 public_html  |  |- sample1.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample2.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample3.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample4.com(フォルダ)  |    |  |    + index.html(Shint_JIS)  |  +-un_txt.php(実行ファイル EUC-JP) この上記構成にある、un_txt.phpというファイルにアクセスすることで、各フォルダ内にあるindex.html内の内容を書換えたいと思っているのですが、PHPはEUCで指定しており、書換えたい各htmlファイルはShift_JISとなっているためか、実行すると文字化けが発生してしまいます。 以下は現時点てのスクリプト、そのままですが、どこがおかしいのかご指摘頂くことは可能でしょうか? <?php $text_data = array("ホームページ", "アイフォン", "スマートフォン"); $array = scandir("./"); mb_convert_variables("EUC-JP", "SJIS", $array); for($i=0; $i<count($array); $i++){ $name = trim($array[$i]); $dir_name = "./".$name; $html = "./".$name."/index.html"; if(is_readable($html)){ @chmod($html, 0606); $addstr = file_get_contents($html); $fp=@fopen("$html","r"); $no = ''; if($fp){ $main = ""; while (!feof($fp)){ $no++; $main .= fgets($fp,1000); } } for($m=0; $m<count($text_data); $m++){ $txt = $text_data[$m]; $no_txt = " "; //$text_data配列に登録されているキーワードを削除。 //削除出来ないため、$no_txt では半角スペースを与えている。 $main = strtr($main, $txt, $no_txt); } $main = mb_convert_encoding($main,"SJIS","EUC-JP"); $fp=fopen($html, "w"); fputs($fp,$main); fclose($fp); } } 以上、お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • phpで携帯にURLをメール送信したい

    php初心者です。お世話になっています。 上手く説明できないかもしれないですが、 20.phpというページで、20.txtからランダムにURLを取り出しています。 この取り出したURLをmail.phpによって 携帯にメール送信したいと思います。 --------20.php---------------- <?php srand((double)microtime()*1000000); $url = "http://*******/?f="; $ad_list1 = file("20.txt"); $ad_key1 = array_rand($ad_list1, 2); $ad1 = $ad_list1[$ad_key1[0]]; $array_ad1 = explode(" ", $ad1); // 表示 echo "<a href=\"$url" . $array_ad1[0] . "\">" . $array_ad1[1] . "</a>"; ?> <form action="mail.php" method="POST" class="form" target="_blank"> <input name="mail1" type="text" class="size-300px" value="あなたの携帯アドレス" style="color:#666666;" onfocus='ClearText1(this, 1)'><br> <input type="submit" name="Submit" value=" 送信 "> </form> --------20.txt------------------ 111 あああ 222 いいい 333 ううう --------mail.php---------------- <?php mb_language("Ja") ; mb_internal_encoding("Shift_JIS") ; $mailto=$mail1; $subject="URL"; $content="ご利用有難う御座います\n紹介者は$array_ad1[1]\n こちらからどうぞ\n$url.$array_ad1[0]"; $mailfrom="From:" .mb_encode_mimeheader("aaaa") ."<http://xxxxxxxx/index.html>"; mb_send_mail($mailto,$subject,$content,$mailfrom); ?> ------------------------------------------- ソースはこんな感じで、メール送信もできました。 メール本文内に「あああ」や「http://*******/?f=111」といった形で文字を代入したいのですが これだけが上手くいきません。 ご指導よろしくお願いしますm(_ _)m

    • ベストアンサー
    • PHP
  • array_randの改善・配列からランダムにキーを取得

    配列からランダムに値を取得したい。関数array_randを用いると可能だが、同じ値を繰り返し取得してしまうことがある。この点を改善したい。方法をおしえてください。 (例) 配列 1,2,3,4,5,6,7,8,9 からarray_randでランダムに1つ選ぶ。 1回目、4が選ばれる。array_randの場合、2回目も4が選ばれてしまうことがある。これを4以外の8つの値から1つを選ぶように改善したい。これを繰り返す。最後は配列が空になるようにしたい。 状況 phpを実行する都度、配列は、別ファイルのデータを読み込んで使用している。実行するユーザーの識別が必要でしょうか?

    • 締切済み
    • PHP
  • 1~100の数字の9の倍数だけ同じ文字、他はランダム

    教えてくださいm(__)m タイトルの通り、0~100の数字の9の倍数だけ同じ文字、他はランダムになるようにするにはどうやって組み立てたらいいのでしょうか? 0~100の数字のうち、9、18、27、36、45、54、63、72、81、90、99だけ同じ文字(例えばA)が表示されるようにしたいのです。でも更新するたび、ランダムに文字(例えばB)が変わります。 その数字は適当な文字(9の倍数以外の文字)がランダムに表示されます。 http://search.net-newbie.com/php/function.array-rand.html ↑のように「array_rand」を使えばいいと思うのですが・・よくわからず・・・(>0<) どういう風にプログラムを書いたらいいのでしょうか。 分かる方いましたら、お願いしますm(__)m

    • ベストアンサー
    • 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とMySQLで100万件のデータを登録

    PHPとMySQLで100万件のデータを登録する方法に困っております。 1.PHPで100万回ループして数字をランダムで取得し一意の数字を配列に格納。 ⇒データ量が多すぎてタイムアウトしてしまいます。いい方法はありますか? while($i<1000000){ $h = sprintf("%07d",mt_rand(1,1000000)); if(!array_search($h,$val)){      array_push($val,$h);      $i++; } } 2.またデータベースはMySQLを使用しようかと考えていますが、一気に登録する方法など効率のいいやり方はありますでしょうか?

    • ベストアンサー
    • PHP