Home > Web > PHP

PHP Archive

第3回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!

百式さんの運営するIDEA*IDEAの「新しくプログラミング言語を覚えたいときに行なうべき10の練習問題」を実際にやってみる第3回目!

今回の問題はこちら!

  1. 複数の数値を入力させ、昇順に並び替え、最大値と最小値を出す(例:同僚の体重を入力して計算)。

今回は体重のソート(順番に並べる)ってことなので、第1関門はフォームから値を入力してもらう事、第2関門にソートする事。
最初はあまり考えずに「体重だけじゃアレだなー」と思って「名前も一緒に入れよう!」と思ったのが運のツキ…めんどくさくなってしまった…

最初にHTMLのフォームからPOSTでデータを受け取る!
これは$_POST["name1"] この1行で終わるので楽勝ですな。(name1はフォームのname属性の値)

次にソートなんだけど、名前を取得せずに体重だけを取得する場合はsort関数を使えばそんなに悩まずにすぐ出来ると思います。
が、しかし!自分は$personという配列の中に3人のデータをさらに配列で作ってしまったのでめんどくさくなりました(´・ω・`)

でも色々調べてみるとarray_multisortという関数があったので、$person配列からweightの値を$weightという新しい配列に移し、この$weight配列の数字の大きい順に$personも並び替えできました。

実際に動いているのはこちら
第3回目「新しくプログラミング言語を覚えたいときに行うべき10の練習問題 〜PHP編〜」

書いたコードはこちら


<?php
//POSTで受け取ったデータを2次元配列に格納
$person = array(
	        		array('name'  => $_POST["name1"], 'weight'  => $_POST["weight1"]),
	        		array('name'  => $_POST["name2"], 'weight'  => $_POST["weight2"]),
	        		array('name'  => $_POST["name3"], 'weight'  => $_POST["weight3"])
	        		);
※問題があったので下に修正したものを書きましたのでそちらを参考にしてください。

//2次元配列の中の連想配列weightの値を配列$weightの中に代入
foreach ($person as $key => $row) {
    $weight[$key]  = $row['weight'];
}

//$weightの数値の大きい順に$personも並び替えする。
array_multisort($weight, SORT_DESC,  $person);

//配列の中を順番に表示
for($i=0; $i<3; $i++){
	echo '<p>名前:'.$person[$i]['name'].' 体重:'.$person[$i]['weight'].'</p>';
}
?>

コメント欄にてyusuke0927さんに下記のようなご指摘を受けました。ありがとうございます!

$_POST["name1"] とやっている箇所は htmlspecialchars() を入れておかないと、<script>タグを埋め込めてJavaScript等を実行できてしまいます。(いわゆるクロスサイトスクリプティングというやつですね)

ということだったので、POSTで受け取ったデータを配列に代入するときに htmlspecialchars()を使ってJavaScript等を実行できないように修正しました。
これで入力されてもそのまま出力されるはずっ!

こういうご指摘は正直ありがたいです。どんどんお願いしますー!


$person = array(
	        		array('name'  => htmlspecialchars($_POST["name1"]), 'weight'  => htmlspecialchars($_POST["weight1"])),
	        		array('name'  => htmlspecialchars($_POST["name2"]), 'weight'  => htmlspecialchars($_POST["weight2"])),
	        		array('name'  => htmlspecialchars($_POST["name3"]), 'weight'  => htmlspecialchars($_POST["weight3"]))
	        		);

次回は「簡易電卓。0で割ったときの処理を自分なりに作りこむ。」だそうだ。がんばるぞ〜!(n’ ∀ ‘)η

関連リンク
第0回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみよう!
第1回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!
第2回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!
第3回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!

第2回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!

百式さんの運営するIDEA*IDEAの「新しくプログラミング言語を覚えたいときに行なうべき10の練習問題」を実際にやってみる第2回目!

今回の問題はこちら!

  1. 現在時刻にあわせてやる気のでるメッセージを出力(例:もうすぐランチ!がんばれ!)。

今回は時間の取得さえできれば問題なっしん。
PHPで日付の取得はdate関数を使えば楽チンなのですぐできました。
配列にメッセージを予め入力しておいて、対応した時間によってそのメッセージを選んで出力するだけ!
後は指定した時刻以外のときのメッセージを入力しておけばOK。

今回作ったプログラムだと1分単位のメッセージなので指定した時間を逃すと見れなくなる…
分単位じゃなくて時間単位にすればよかったかなー。でも「はなまるマーケット」は8時半だし仕方ないw
個別に「このメッセージは分刻みだけどそれ以外は時間刻みで!」という場合はswitchで分岐しないでifで分岐すればいいよー!(n’ ∀ ‘)η

実際に動いているのはこちら
第2回目「新しくプログラミング言語を覚えたいときに行うべき10の練習問題 〜PHP編〜」

書いたコードはこちら


<?php
$message = array('(n' ∀ ')η<起きろ〜!',	//7時
			'(n' ∀ ')η<はなまるマーケット始まったよ!そろそろ家出ないと遅刻!',	//8時半
			'(n' ∀ ')η<出社!今日も1日がんばろ〜!',//10時
			'(n' ∀ ')η<お昼だ〜!今日は何食べる?',//13時
			'(n' ∀ ')η<眠くなる時間だが耐えるのだっ!',//15時
			'(n' ∀ ')η<定時まで後1時間!もう少しだよ!',//17時半
			'(n' ∀ ')η<定時になった!残業なければ帰れるよ!',//18時半
			'(n' ∀ ')η<そろそろ夕食だよー!',//20時
			'(n' ∀ ')η<今日もお疲れさまでしたっ!');//1時

switch(date("H:i")){
	case '07:00':
		$str = $message[0];
		break;
	case '08:30':
		$str = $message[1];
		break;
	case '10:00':
		$str = $message[2];
		break;
	case '13:00':
		$str = $message[3];
		break;
	case '15:00':
		$str = $message[4];
		break;
	case '17:30':
		$str = $message[5];
		break;
	case '18:30':
		$str = $message[6];
		break;
	case '20:00':
		$str = $message[7];
		break;
	case '01:00':
		$str = $message[8];
		break;
	default:
		$str = '( ̄- ̄)シーン';
}
echo $str;
?>

次回は「複数の数値を入力させ、昇順に並び替え、最大値と最小値を出す(例:同僚の体重を入力して計算)。」だそうだ。がんばるぞ〜!(n’ ∀ ‘)η

関連リンク
第0回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみよう!
第1回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!
第2回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!
第3回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!

第1回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!

百式さんの運営するIDEA*IDEAの「新しくプログラミング言語を覚えたいときに行なうべき10の練習問題」を実際にやってみる第1回目!

今回の問題はこちら!

  1. 「なんらかのカウントアップメッセージを1から100まで出すけど、3のときだけアホになる!(例:1万円!2万円!しゃ~ん万円!とか)」。

まぁ要するに世界のナベアツですなw
今回の問題は簡単なようで実は結構難しかった(めんどくさかった)です。

というのも、3で割り切れる数字のときだけアホになれば楽なのですが、3で割り切れない場合でかつ数値に3が入っていた場合もアホになるのです。31とかね。

この割り切れないけど、数値に3が入っていた場合の処理がめんどくさかったです。
実際に出来上がったコードを書くので参考にしてみてください。
解りやすいようにコメント多めにしてみましたがどうでしょう?

自分で読み返してみても無駄な処理が多いので、もっとスリムアップできると思います。
やっぱりこの場合正規表現かすら?(n’ω’ `)

実際に動いているのはこちら
第1回目「新しくプログラミング言語を覚えたいときに行うべき10の練習問題 〜PHP編〜」

書いたコードはこちら


<?php
//アホになる場合の文字$str1は一桁、$str2は二桁
$str1 = array('', 'いち', 'にっ', 'さん', 'しっ', 'ご', 'ろく', 'なな', 'はち', 'きゅう', 'じゅう');
$str2 = array('', 'じゅ〜う', 'にじゅ', 'さ〜んじゅ', 'よ〜んじゅ', 'ご〜じゅ', 'ろくじゅ〜', 'ななじゅ〜', 'はちじゅ〜', 'きゅうじゅ');

//1から100までループ
for($i=1; $i<=100; $i++){
 	//1桁の場合
 	if($i<10){
  		//3の倍数の場合
  		if(!($i%3)){
   			$sum = $str1[$i];
  		}
  		//普通の数字の場合
  		else{
   			$sum = $i;
  		}
 	}
 	//2桁、3桁の場合
 	else{
  		//2桁の場合、10の位と1の位を抜き出し
  		$num1 = mb_substr($i,0,1);
  		$num2 = mb_substr($i,1,2);
  		
  		//10の位と1の位が3の場合か、3の倍数の場合
  		if($num1 ==3 || $num2 ==3 || !($i%3)){
   			$sum = $str2[$num1];
   			$sum .= $str1[$num2];
  		}
  		//普通の数字の場合
  		else{
   			$sum = $i;
  		}
 	}
 	//出力
 	echo $sum.'万円!<br>';
}
?>

次回は「現在時刻にあわせてやる気のでるメッセージを出力」だそうだ。がんばるぞ〜!(n’ ∀ ‘)η

関連リンク
第0回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみよう!
第1回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!
第2回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!
第3回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみた!!

第0回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみよう!

ちょっと前になるけど、百式さんの運営するIDEA*IDEAで「新しくプログラミング言語を覚えたいときに行なうべき10の練習問題」というエントリーがあったので、時間があるときに少しずつ作ってみようと思います。

Rubyがオススメとか良く聞くけれど、使う言語はPHP。PHPを使う理由はやっぱり業務に直結しやすいから。

さて、実際にエントリーの中で書かれていた練習問題は下記の通り。

  1. 「なんらかのカウントアップメッセージを1から100まで出すけど、3のときだけアホになる!(例:1万円!2万円!しゃ~ん万円!とか)」。
  2. 現在時刻にあわせてやる気のでるメッセージを出力(例:もうすぐランチ!がんばれ!)。
  3. 複数の数値を入力させ、昇順に並び替え、最大値と最小値を出す(例:同僚の体重を入力して計算)。
  4. 簡易電卓。0で割ったときの処理を自分なりに作りこむ。
  5. キーワードを入れてYahoo!の検索結果を出力。
  6. テキストを入れると語尾が赤ちゃん言葉に(例:ですよ→でちゅよ)。
  7. メールアドレスを入れるとあらかじめ用意されたテンプレートファイルにそのメアドを埋め込んだ上でメール送信(スパムはダメだよ!)。
  8. 「(名前)が、(場所)で、(アクション)した」がランダムに組み合わされて出てくるプログラム。
  9. URLを入れるとそのページのはてなブックマーク数が出てくるプログラム。
  10. ある名前とある名前を入れると相性診断を10段階で出してくれるプログラム。診断結果は適当でもいいけど、同じ組み合わせだったら同じ数値が必ずでないといけないように。

一見、簡単な順に並んでるのかと思ったけどそんなことないような気が…

簡単かなー?と思う練習問題は、1、2、3、5、8、9。
ちょっと難しいかも?と思う練習問題は4、6、7、10。

5、9はYahoo!、はてなブックマークのAPIを使うので若干難しそうに思ったけど、PHPのSimpleAPI(だよね?)を使うと割と簡単にできそう。

意外と難しいと思われるのが4。0で割ったときの処理をどうするかかな?強制的にエラー出してしまえばいいのかすら?

後は7のメール送信の処理かな?メール送信の部分はサーバーによっても違うかもしれないし調べつつやってみようー!

最後の10は普通に難しい…まずどうやって判定させたものか困る…

そんなわけで、コードを公開してやっていくので変な処理してたり困ってたら教えてください><

名言集.comの名言を一日一回POSTするtwitterBOTを作った。

まめことネコゼのどたばた会議で宣言した「名言BOTを作る!」を完成させました。
http://twitter.com/dictumer

今回はPHPとpearを使って、CORESERVERで動かしています。
CORESERVERでpearを動かすにあたってはこちらのエントリーが非常に参考になりました。あざっす!(n’ ∀ ‘)η
共有サーバ(CORESERVER.JP)で自由にPEARのインストールをする

twitterへのPOST自体はpearを使えばすごく簡単に出来るのですが、HTMLを取得して特定のタグから必要なデータのみ抜き出す(スクレイピング)作業と、その抜き取ったデータの処理(無駄なデータを削除するなど)、エラー処理に苦労しました。

pearを使ったのが初めてだった事もあるのですが、スクレイピングのやり方が分からずPHPで昔ながらの手法で作業しました。これは何か方法があるに違いない!pear&PHPの詳しい人教えて!><

まぁそんなつたないコードですが、公開しますので赤字つけてくれる人大募集!
コメントでもtwitterでも何でも良いのでお願いします><


<?php
require_once 'HTTP/Request.php';

//名言集.comの最大数
$max = 2019;

//乱数を生成
$random = rand(0,$max);

//twitterAPIのURL
$url ="http://twitter.com/statuses/update.xml";

// URL をオープン
$fp = @fopen('http://www.meigensyu.com/word/index'.$random.'.html', 'r');

//データが無い場合は再度乱数を生成してURLを変更する
while (!$fp) {
//乱数を再度生成
$random = rand(0,$max);
echo '乱数;'.$random.'<br />';
$fp = @fopen('http://www.meigensyu.com/word/index'.$random.'.html', 'r');
if($fp) break; // ループ脱出
}

// HTML を読み出す
while (! feof($fp)) {
$buffer = fgets($fp, 4096);
if(strpos($buffer, '"text"')){
while(!strpos($buffer, '</div>')){
$meigen .= $buffer;
$buffer = fgets($fp, 4096);
}
$meigen .= $buffer;
}
else if(strpos($buffer, '"author"')){
while(!strpos($buffer, '</div>')){
$author .= $buffer;
$buffer = fgets($fp, 4096);
}
$author .= $buffer;
}
}
//タグ除去
$meigen = strip_tags($meigen);
$author = strip_tags($author);

//正規表現でテキストから不要な部分を除去
//特定のカテゴリに入ってる名言は
if( ereg("\[映画の名言\]|\[漫画・アニメの名言\]|\[ドラマの名言\]|\[ことわざ\]", $author) ){
$meigen = ereg_replace("[\r\n\]| |&nbsp;", "", $meigen);
$author = ereg_replace("[\r\n\]| &nbsp;| |&nbsp;&nbsp;|^&nbsp;|\[.+\]|&nbsp;出典.|^出典.", "", $author);
$author = ereg_replace("&nbsp;", " ", $author);
}
else{
//全角スペース、半角スペース除去
$meigen = ereg_replace("[\r\n\]| |&nbsp;", "", $meigen);
$author = ereg_replace("[\r\n\]| &nbsp;| |^&nbsp;|&nbsp;&nbsp;|^出典.|&nbsp;出典.|\(.+\)|\[.+\]|(.+)", "", $author);
$author = ereg_replace("/出典+/", "", $author);
}
// HTML のクローズ
fclose($fp) or die("CLOSE");

//出典が空の場合があるので「不明」と入力
if($author=='') $author='不明';

// ソケットを開き、送信形式を指定し、データを送信する
$req = new HTTP_Request();
$req->setBasicAuth("twitterID", "twitterPASSWORD");
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addPostData('status', $meigen.' 出典:「'.$author.'」');
$req->setURL($url);

if (!PEAR::isError($req->sendRequest())) {
$response = $req->getResponseBody();
}
?>

いまさらFlickrのAPIを使ってみたよ!

  • 2007-05-25 (金)
  • PHP

今まで、他人が作ったマッシュアップは大量に見てきたけど自分でAPIを使った何かを作ったことが無かったので、今更FlickrのAPIを利用したギャラリーを作ってみたよ!

PHPを選んだ理由は特別無く、Perlはデバックが面倒な印象があったので、 「それならPHP勉強してみるか〜」っというだけ。
http://flickr.shinla.org/

  • PHP5専用
  • なんちゃってオブジェクト指向
  • サムネイルクリック時にLightBoxとFlickrへ飛ばすか選べるよ!

以下、コードと反省点などなど。

Continue reading

Home > PHP

Search
Google
Feeds
Meta
あわせて読む
あわせて読みたい
Yahoo! ログール読む

Return to page top