ホーム > タグ > PHP

PHP

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

  • 2008-06-07 (土)
  • PHP
  • Tags:
  • hatena add hatena users
  • send twitter

第 1 回第 2 回に続き、今回は第 3 問。問題はこちら。

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

フォームに名前と体重を 3 つずつ用意し、POST でデータを受け取って、名前をキーにした連想配列に格納。その連想配列を asort 関数でソートして MAX と MIN を表示しています。
あと一応、受け取った側で入力チェックもしてあります。

<?php
for($i = 1; $i <= 3; $i++) {
  if(strlen($_POST['name'.$i]) == 0) {
    print($i.'番目の名前を入力してください。');
    return;
  }
  if(!is_numeric($_POST['weight'.$i])) {
    print($i.'番目の体重の入力が間違っています。');
    return;
  }
}

$data = array(
  htmlspecialchars($_POST['name1']) => htmlspecialchars($_POST['weight1']),
  htmlspecialchars($_POST['name2']) => htmlspecialchars($_POST['weight2']),
  htmlspecialchars($_POST['name3']) => htmlspecialchars($_POST['weight3'])
);
asort($data, SORT_NUMERIC);
$keys = array_keys($data);
$values = array_values($data);
print('最も体重が重いのは・・・ '.$keys[count($keys) - 1].' : '.$values[count($values) - 1].'<br />');
print('最も体重が軽いのは・・・ '.$keys[0].' : '.$values[0].'<br />');
?>

>>作成したサンプルはこちら

参考リンク

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

  • 2008-06-03 (火)
  • PHP
  • Tags:
  • hatena add hatena users
  • send twitter

前回のエントリ、「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」を PHP で解いてみる【第 1 回】の続き。今度は第 2 問。

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

以下ソース。24時間分のメッセージを配列に入れて、現在時刻を配列の要素位置に入れるだけ。
何もひねりが無いですが。24個のメッセージを考えるのがいちばん大変でしたw

<?php
$msg = array(
'0時です。そろそろお休みですか?',
'1時です。まだ起きてるんですか?',
'2時です。夜更かしですか?',
'3時です。徹夜ですか?',
'4時です。徹夜ですか?それとももう起きたんですか?',
'5時です。おはようございます。早起きですね。',
'6時です。ラジオ体操でもしますか?',
'7時です。今日も1日がんばりましょう。',
'8時です。会社に行く時間ですね。いってらっしゃい。',
'9時です。出社しましたか?今日もお仕事がんばって。',
'10時です。お仕事は順調に進んでますか?',
'11時です。もうちょっとで昼休みですよ。がんばって。',
'12時です。お昼ごはんは食べましたか?',
'13時です。午後のお仕事開始ですね。がんばって。',
'14時です。ちょっと眠くなってきましたか?気分転換でもしてみては?',
'15時です。おやつの時間ですね。',
'16時です。もう一息!',
'17時です。そろそろ今日のお仕事終わりですね。',
'18時です。今日もお仕事お疲れさまでした。',
'19時です。ビールでも飲みながら野球中継とかどうですか?',
'20時です。晩ご飯は食べましたか?',
'21時です。晩酌でもどうですか。',
'22時です。お風呂は入りましたか?',
'23時です。良い子はそろそろ寝る時間ですね。'
);

$d = (int)date('H');
print($msg[$d]);
?>

>>作成したサンプルはこちら

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

  • 2008-05-30 (金)
  • PHP
  • Tags:
  • hatena add hatena users
  • send twitter

suniti さんの「blog.grayash.com - 第0回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみよう!」というエントリーに感化されて、IDEA * IDEA の「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」というエントリーで書かれている練習問題を PHP で解いてみることにします。

全部で10問ありますが、まずは第 1 問。世界のナベアツですねw

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

で、解いてみました。

<?php
$aho10 = array ('', 'じゅー', 'ぬぃじゅ', 'さぁんじゅ', 'よぉんじゅ', 'ごぉじゅ', 'ろくぅじゅ', 'ななじゅ', 'はぁちじゅ', 'きゅーじゅ');
$aho1 = array ('', 'いっち', 'ぬぃー', 'さぁーん', 'よぉーん', 'ごぉー', 'ろくー', 'しぃっち', 'はぁっち', 'きゅー');

for ($i = 1; $i <= 100; $i++) {
  if ($i % 3 == 0 || strpos((string)$i, '3') !== false) {
    print ($aho10[(int)($i / 10)].$aho1[$i % 10].'<br />');
  } else {
    print ($i.'<br />');
  }
}
?>

引っかかったところは、strpos 関数で 3 があるかどうか調べるところ。
当初 strpos((string)$i, ‘3′) >= 0 という条件にしたのですが、3 が見つからなかった場合でもこの条件が true になってしまいました。
調べた結果、false が 0 として判断されたためだと分かったので、!== 演算子を使って見つかったかどうかを判断するようにしました。

>>作成したサンプルはこちら

参考リンク

Google Trends のキーワードを投稿する Twitter bot

Google で検索数が急上昇しているキーワードを、Twitter に投稿する bot を作りました。

Twitter / GoogleTrendsFan

元になるページはこちら。
急上昇ワード

実際には、こちらの XML 形式で返してくれる API から取得しています。
http://www.google.com/m/services/trends/get

今のところ 1 時間毎 cron で取得し、トップ 10 を配信しています。

ソース

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

// パラメータ
$username = 'google_trends';
$password = '**********';
$auth = array(
  'Authorization' => 'Basic '.base64_encode($username.':'.$password)
);
$link_url = 'http://tinyurl.com/6r7zux';

// Google Trends の XML からキーワードを抽出
$items = array();
$xml = simplexml_load_file('http://www.google.com/m/services/trends/get');
if($xml) {
  for($i = 0; $i < 10; $i++) {
    $query = $xml->item[$i]->query;
    if($query) {
      $items[] = mb_convert_encoding($query, 'UTF-8', 'auto');
    }
  }
} else {
 return;
}
$status = $link_url.' '.implode(', ', $items);

// Twitter に post
$client =& new HTTP_Client(null, $auth);
$http_status = $client->post("http://twitter.com/statuses/update.xml", array('status' => $status));
?>

やってることはいたって単純。SimpleXML を使って Google Trends の XML を取得して、Twitter に BASIC 認証して発言するだけです。

関連リンク

PHP で Twitter をスクレイピングする

Twitter API を使っても過去の user_timeline を取得できないので、PHP で直接 Web をスクレイピングして取得してみました。

環境

・PHP 5.2.3
・PEAR::HTTP_Client を使用

取り出す内容

・id
・メッセージ(text)
・permalink
・発言日時

コード(クラス)

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

class Twitter_Scrape {

  private $statuses;

  public function __construct () {
  }

  public function getTimeline ($username, $page = 1) {
    $url = 'http://twitter.com/'.$username.'?page='.$page;

    $client =& new HTTP_Client();
    $client->get($url);
    $response = $client->currentResponse();

    $res = mb_convert_encoding($response['body'], 'UTF-8', 'UTF-8,SJIS,EUC-JP,JIS');
    $dom = @DOMDocument::loadHTML($res);
    if ($dom) {
      $xml = simplexml_import_dom($dom);
      if ($xml) {
        $i = 0;

        // $page が 1 の場合は最新の発言を取得する
        if ($page == 1) {
          $entries = $xml->xpath('//div[@class="desc hentry"]');
          $content = $entries[0]->xpath('p[@class="entry-title entry-content"]');
          $meta = $entries[0]->xpath('p[@class="meta entry-meta"]');
          $statuses[$i++] = array(
            'id'	 => substr($meta[0]->a[0]['href'], -9),
            'text' => strip_tags($content[0]->asXML()),
            'permalink' => $meta[0]->a[0]['href'],
            'date' => $meta[0]->a[0]->abbr['title']
          );
        }

        // ページ内の発言を取得する
        // URL が長いと途中で切れてしまう...
        $entries = $xml->xpath('//tr[@class="hentry"]');
        foreach ($entries as $entry) {
          $content = $entry->xpath('td[@class="content"]');
          $meta = $content[0]->xpath('span[@class="meta entry-meta"]');
          $statuses[$i++] = array(
            'id' => substr($entry['id'], 7),
            'text' => strip_tags($content[0]->span[0]->asXML()),
            'permalink' => $meta[0]->a[0]['href'],
            'date' => $meta[0]->a[0]->abbr['title']
          );
        }
        return $statuses;
      } else {
        print ('xml parse error');
      }
    } else {
      print ('dom parse error');
    }
  }
}
?>

コード(呼出元)

<?php
require_once "twitter_scrape.class.php";

$req = new Twitter_Scrape();
$statuses = $req->getTimeline('yusuke0927', 1);
foreach ($statuses as $status) {
  print('<tr>');
  print('<td>'.$status['id'].'</td>');
  print('<td>'.$status['text'].'</td>');
  print('<td>'.$status['permalink'].'</td>');
  print('<td>'.$status['date'].'</td>');
  print('</tr>');
}
?>

簡単な説明

インスタンスを生成して、getTimeline でユーザ名とページ数を渡すと、スクレイピングした結果を連想配列で返します。

問題点

発言に含まれる URL が長いと切れたままになってしまう。これは発言を asXML で取得した後に strip_tags でタグを除去しているせい。なんとかしたい。

 Page 2 of 3 « 1  2  3 »

Home > Tags > PHP

Search
Feeds
Meta
あわせて読みたい
あわせて読みたいブログパーツ
Others...
フィードメーター - sukechan.net
track feed

Return to page top