[PHP]閏年かどうか判定する

閏年は基本的に4年に一度ですが、100 で割り切れる年は閏年ではありません。 ただし、400 で割り切れる場合は閏年とするというややこしい法則があります。

if文で「%4==0」などを組み合わせて調べてもいいですが、関数「date(‘L’)」で閏年を簡単に調べられます。

<?php
$year = 2012;
if(date('L', mktime(0,0,0,1,1,$year))){
    echo "閏年です";
}

[PHP]ついやってしまいがちな汚いソース10種

私自身よくやってしまうので、自分への戒めも込めて「悪いソースコード」の例を幾つか上げてみようと思います。

1. 型を意識しないで変数を使いまわす

$num = 1234;
$num = 'number' . $num;
echo $num;

気をつけてないとかなりの頻度でこうなっています。PHP ならではの現象。

2. 条件分岐やループのネストが深すぎる

if($param[0] == 'a'){
  if($param[1] == 'b'){
    foreach($arr as $value){
      if($param[2] == $value){
        for($i=0;$i<=10;$i++){
          echo 'Hello, World!';
        }
      }
    }
  }
}

たいていは目的ごとに関数を定義すると綺麗にまとまることが多い気がします。

3. 一行に詰め込みすぎる

echo htmlspecialchars(number_format($dom->getElementsByTagName('test')->item(0)->nodeValue), ENT_QUOTES);

一旦変数に入れておかないとどんどん伸びていきます。

4. マジックナンバーを使う

someFunction(100,300,200);

書いてる途中は覚えてますが後で見直すとなんの数字だったかわからなくなります。

5. 後から for 文を書き足した結果 $i, $j を変な順番で使う

for($j=0;$j<=10;$j++){
  for($i=0;$i<=10;$i++){
    echo 'hello, world';
  }
}

書き換えるのが面倒くさかったりしてそのままにしておくとややこしくなります。

6. 細か過ぎる連結

echo '<a href="' . $url . '">' . '<img src="' . $src . '" alt="' . $alt . '" />' . "</a>\n";

ヒアドキュメント使うまでもないとき使いたくなりますが、ダブルコーテーションで括ったほうがまだましです。
厳密にはシングルクォートで連結するとわずかに早くなるそうですが我々は陸上選手ではありません。
printf() を使うのも良いと思います。

7. 省略しすぎる

if($p > $m && $t != 0){
    $nx = true;
    $cp = cp($p);
}

Javascriptなら有効かもしれませんが、変数に何が入っているか検討がつかないのはバグの元になります。

8. やたら複雑な配列変数を一発で宣言する

$array = array(
  'food' => array(
    'fruit' => array('apple', 'orange')
  ),
  'animals' => array(
    array(
      'name' => 'rabbit',
      'color' => array('name' => 'white', 'code' => '#FFFFFF')
    )
  )
);

どちらかというと関数設計段階での問題なので避けられないケースも有ります。
丁寧にインデントして可読性を高める等の工夫が必要です。

9. 命名規則があやふや

$arrUser    = array();
$categories = array();
$STRING     = 123;

getSomething( $arrUser );
load_something( $category );

すみません、私です。

10. すごく日本語

$toukousuu = 100;
$ninzuu    = 20;

$heikin = $toukousuu / $ninzuu;

これは絶対にやらない。でも他人のソースがこうなっていると嫌がらせかと思います。
$_POST[‘me-ru’] とか書いてあると鳥肌が立ちます。

[PHP]日付から曜日を割り出す

PHP は標準関数が豊富に用意されているので、年月日がわかっていれば曜日を取得するのは難しくありません。
PHP で日付を扱う方法は主に2つあり、date() を使う方法と、PHP 5.2 以降で使用できる DateTime クラスを使う方法です。date() は古くからある方法で、ほとんどの環境で使うことが出来ますが、32bit環境でタイムスタンプ(UNIX時間)を使用する場合 2038年1月19日 までしか使用できないという欠点を抱えています。(2038年問題)
ここでは将来的に主流になっていくと考えられている DateTime クラスを使った方法に絞って解説していきます。

DateTime クラスは通常通りクラスとして扱う方法と、関数のように扱える手続き型を利用する方法が用意されています。どちらも曜日は 0~6 の数字の形で返すので日本語で曜日を表すには 日~土 の配列変数を作っておくと簡単です。

【現在の曜日】

<?php
$datetime = new DateTime();
$week = array("日", "月", "火", "水", "木", "金", "土");
$w = (int)$datetime->format('w');
echo $week[$w];
<?php
$week = array("日", "月", "火", "水", "木", "金", "土");
$datetime = date_create();
$w = (int)date_format($datetime, 'w');
echo $week[$w];

【日付が文字列として与えられている場合】

<?php
$date = "2012-12-05";
$datetime = new DateTime($date);
$week = array("日", "月", "火", "水", "木", "金", "土");
$w = (int)$datetime->format('w')
echo $week[$w];
<?php
$date = "2012-12-05";
$datetime = date_create($date);
$week = array("日", "月", "火", "水", "木", "金", "土");
$w = (int)date_format($datetime, 'w');
echo $week[$w];

【日付の年月日がそれぞれ数値で与えられている場合】

<?php
$year  = 2012;
$month = 12;
$day   = 5;
$datetime = new DateTime();
$datetime->setDate($year, $month, $day);
$week = array("日", "月", "火", "水", "木", "金", "土");
$w = (int)$datetime->format('w');
echo $week[$w];
$year  = 2012;
$month = 12;
$day   = 5;
$datetime = date_create();
date_date_set($datetime, $year, $month, $day);
$week = array("日", "月", "火", "水", "木", "金", "土");
$w = (int)date_format($datetime, 'w');
echo $week[$w];

format() は日付を文字列の形で取得する関数です。年月日を表示する場合 format('Y-m-d') のようにします。
「w」を使うと 0 ~ 6 の値を得ることが出来ます。これは週の何日目であるか(Day of Week)を表すもので、要するに曜日です。

DateTime で取得される時間はタイムゾーンの影響を受けます。php.ini や date_default_timezone_set() で設定をしていない場合は、「new DateTime('now', new DateTimeZone('Asia/Tokyo'))」あるいは「date_create('now', timezone_open('Asia/Tokyo'))」のように設定するか、「$datetime->setTimezone(new DateTimeZone('Asia/Tokyo'))」、「date_timezone_set($datetime, timezone_open('Asia/Tokyo'))」のように後から指定する必要があります。