2010年7月25日日曜日

PHPでの camelCaseへの変換と camelCaseからの変換のサンプル

アンダーバーやハイフンやスペースで単語を繋いだ文字列(例 foo_bar_baz)を、camelCaseやPascalCase(Upper Camel Case)に変換したいことがしばしばある。
その他にも先頭だけ大文字にしたかったり、各単語の先頭だけ大文字にしたかったりとか。
PHPにはucfirst()やucwords()があるから意外に楽にできる。



アンダーバー等で単語を繋いだ文字列を、他の形式に変換する

$separator = '_';    //区切り文字
$str = 'foo_bar_baz';  //変換対象の文字列

//先頭だけ大文字にする
echo ucFirst($str); // => Foo_bar_baz

//以降の変換の共通前処理
$ucSpace = ucWords(str_replace($separator, ' ', $str)); // => Foo Bar Baz

//各単語の先頭が大文字にする
echo str_replace(' ', $separator, $ucSpace); // => Foo_Bar_Baz

//PascalCase(先頭は大文字)にする
echo str_replace(' ', '', $ucSpace); // => FooBarBaz

//camelCase(先頭は小文字)にする ※要PHP5.3+
echo lcFirst(str_replace(' ', '', $ucSpace)); // => fooBarBaz
スペース区切りにすればucWords()が使えるのがミソ。もともと使いたい区切り文字がスペースならもっと楽。

lcfirst()のないPHP5.3未満でcamelCaseにするには少し面倒かも。
この方法が一番手軽そう(未検証)→ PHP: lcfirst - Manual



camelCaseから区切り文字で繋いだ形式に変換する
$separator = '_';    //区切り文字
$camel = 'fooBarBaz';
echo strToLower(preg_replace('/([a-z])([A-Z])/', "$1$separator$2", $camel)); // => foo_bar_baz
PascalCaseからTitle Case(スペース区切りで先頭だけ大文字の形式)への変換なら、strToLower()は要らない。



ハイフン区切りの文字列・先頭が大文字のスペース区切りの文字列・PascalCaseの文字列の相互変換ならこんな感じか。
function convertCase($str, $case) {
    switch ($case) {
        case 'hyphen':    // foo-bar-baz
            $str = preg_replace('/([a-z])([A-Z])/', "$1-$2", $str);
            return str_replace(' ', '-', strToLower($str));
        case 'normal':    // Foo bar baz
            $str = preg_replace('/([a-z])([A-Z])/', "$1 $2", $str);
            return str_replace('-', ' ', ucFirst(strToLower($str)));
        case 'pascal':    // FooBarBaz
            return str_replace(' ', '', ucWords(str_replace('-', ' ', $str)));
    }
}
正規表現だけでもいろいろできちゃいそうだけど、(正規表現を駆使出来ていない自分のような人には)見辛くなるのでstr_replace()を使った。(コードが横に長くなるし。)

2010年7月5日月曜日

jQuery UIの Datepickerで日本語のカレンダーを表示する方法

(2010/07/05追記:年月選択のオプションと、その見た目の調整のCSSを追加した。)
(2013/05/01変更:CSSがmin対応したので変更した。)

必要なJavaScriptとCSSは、全てGoogleがホスティングしてくれてた。
(2010/10/12追記:日本の祝日を表示するGCalendar HolidaysだけはGoogleはホスティングしていない。)


サンプルコード

<!DOCTYPE html>
<html lang="ja">
<head>
<title>Datepicker</title>

<!-- jQuery UIのCSSファイルの読み込み -->
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/flick/jquery-ui.min.css" />

<!-- 見た目の調整 -->
<style>
.ui-datepicker td span, .ui-datepicker td a {
    text-align: center;    /* 日付はセンタリングの方が好き */
}
/* 2011/4/25 削除 (土日の背景色はGClendar Holidaysが付けてくれる)
.ui-datepicker-week-end .ui-state-default {    / * 土日の背景を変える * /
    background-image: none;
    background-color: #b4ebfa;
}
*/
.ui-datepicker select.ui-datepicker-year, .ui-datepicker select.ui-datepicker-month {
    width: auto;    /* そのままだと改行してしまう */
}
.ui-datepicker select.ui-datepicker-month {
    margin-left: 1em;    /* ちょっと離すほうが好き */
}
</style>

</head>
<body>

<input id="test" type="text" />


<!-- JavaScriptファイルの読み込み -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>

<!-- 日本語カレンダーを表示するにはこれも要る -->
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js"></script>

<!-- こちらなら日本だけでなく全てのローカライズができるが、ファイルサイズが大きい
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery-ui-i18n.min.js"></script>
-->

<!-- 2010/10/12追記:日本の祝日も表示 -->
<script src="gcalendar-holidays.js"></script>

<script>
$(function() {
    //テキストボックスにカレンダーをバインドする(パラメータは必要に応じて)
    $("#test").datepicker({
        //regional: "ja",    //日本語化 (2011/4/25 削除、要らなくなったみたい)
        showButtonPanel: true,    //「今日」「閉じる」ボタンを表示する
        firstDay: 1,    //週の先頭を月曜日にする(デフォルトは日曜日)
      
        //年月をドロップダウンリストから選択できるようにする場合
        changeYear: true,
        changeMonth: true,
      
        //選択可能な日付の範囲を限定する場合(月は0~11)
        minDate: new Date(2010, 6 - 1, 16),
        maxDate: new Date(2010, 8 - 1, 15)
    });
});
</script>

</body>
</html>

jQuery UIのテーマ(外観のデザイン)はjQuery UI - ThemeRollerで見られる。


Datepickerのローカライズ用ファイルは、Google AJAX Libraries APIjQuery UI on Google Codeと同じディレクトリ構成だったので見つけられた。(余談だがi18nディレクトリには今のところDatepickerのローカライズ用ファイルしか無いようだ。)
Google Codeの方には最小化されたファイル(xxx.min.js)は無かったが、AJAX Libraries APIの方にはあった。(ローカライズ用JSファイルは最小化してもそれほどファイルサイズが小さくならないけど。)CSSはminは無いようだ。
ちなみにjQuery UI本家のDatepickerのデモでもGoogle AJAX Libraries API(きちんとmin.jsの方)のを使っていた。


Google AJAX Libraries APIを使う場合にバージョンアップで突如使えなくなるのを回避したいなら、jQueryとjQuery UIのバージョンはリビジョンまでしっかり指定しておいた方が無難。


(2010/08/19追記)
GCalendar Holidaysを使えば、Datepickerのカレンダー上に日本の祝日を表示できる。(2011/4/25 さらに追記:土日の背景色も表示してくれる。)
サンプル:GCalendar HolidaysでjQuery UI Datepickerに祝日を表示するのサンプル - ゼロと無限の間に
(追記終わり)


参考

PHP 5.3の地味な新機能 「ネストされたException」

PHP5.3から、Exceptionのコンストラクタの第3引数に別のExceptionを渡せるようになったらしい。


例えばこんな感じで。

<?php throw new Exception('Ex1', 0, new Exception('Ex2')) ?>

エラー出力はこんな感じになる。第3引数として渡された方が先に出力され、親の方は「Next exception」として出力される。
PHP Fatal error:  Uncaught exception 'Exception' with message 'Ex2' in /xxx/exception.php:1
Stack trace:
#0 {main}

Next exception 'Exception' with message 'Ex1' in /xxx/exception.php:1
Stack trace:
#0 {main}
  thrown in /xxx/exception.php on line 1




もういっちょいってみるか?
<?php throw new Exception('Ex1', 0, new Exception('Ex2', 0, new Exception('Ex3'))) ?>

結果。
Fatal error: Uncaught exception 'Exception' with message 'Ex3' in /xxx/exception.php:1
Stack trace:
#0 {main}

Next exception 'Exception' with message 'Ex2' in /xxx/exception.php:1
Stack trace:
#0 {main}

Next exception 'Exception' with message 'Ex1' in /xxx/exception.php:1
Stack trace:
#0 {main}
  thrown in /xxx/exception.php on line 1


便利そうだが、今のところ使いどころを思いつかない。


参考:PHP 5.3で追加された例外のうんたらかんたら - ゆっくり*ゆっくり

ブログ アーカイブ

tags