数値を2桁にそろえたい場合が意外に多いのでメモ。
一桁だった場合先頭をゼロで埋める処理(ゼロパディング)を行う。
$num = '5';
$num = sprintf('%02d', $num);
var_dump($num);
↓
string(2) "05"
第一引数のフォーマットを「’%05d’」、「’%07d’」とかにすれば任意の桁数まで0で埋めてくれるので便利。
数値を2桁にそろえたい場合が意外に多いのでメモ。
一桁だった場合先頭をゼロで埋める処理(ゼロパディング)を行う。
$num = '5';
$num = sprintf('%02d', $num);
var_dump($num);
↓
string(2) "05"
第一引数のフォーマットを「’%05d’」、「’%07d’」とかにすれば任意の桁数まで0で埋めてくれるので便利。
今まではmime_content_type()を使用してたけど、非推奨らしいので推奨メソッドで取得する方法のめも。
function getMimeType($filePath) {
// ファイルインフォリソースを作成
$finfo = finfo_open(FILEINFO_MIME_TYPE);
// mimeTypeを取得
$mimeType = finfo_file($finfo, $filePath);
// リソースをクローズ
finfo_close($finfo);
// 値を返却する
return $mimeType;
}
finfo_open()なんて初めて聞いた件。笑
基本的にRFC4180準拠のCSVファイル用。文字コードはSJISを想定、区切り文字はカンマ、文字列は必ず「”」で囲うことを前提とする。
※文字列がマルチバイト、かつ「”」で括られていないカラムは場合文字化けするので注意。
function importCsv($filePath) {
// 返却用の入れ物を用意
$data = array();
// ファイルポインタを読み取り専用でオープン
$fp = fopen($filePath, 'r');
// ロケールをja_JPにセット(これをしないとマルチバイトを読み込んだ際に文字化けするので注意)
setlocale(LC_ALL, 'ja_JP');
// ファイルの先頭から終端まで読み込む
while(!feof($fp)){
$line = fgetcsv($fp);
if($line) {
// 読み込むと同時に文字コードをSJISから現在の設定値へ変換する
foreach($line as $k => $v) $line[$k] = mb_convert_encoding($v, mb_internal_encoding(), 'SJIS');
$data[] = $line;
}
}
// 値を返却する
return $data;
}
メモ
function exportCsv($fileName, $data, $header = null) {
// headerがあれば先頭行に追加
if(!is_null($header)) array_unshift($data, $header);
// tmpファイルストリームをオープン
$fp = tmpfile();
// データの書き込み
foreach($data as $v) fputcsv($fp, $v, ',', '"');
// ファイルポインタを先頭へ移動
rewind($fp);
// ストリームを文字列に読み込む
$csv = stream_get_contents($fp);
// 文字コードをSJISにコンバート(excelで開いた際の文字化け対策)
$csv = mb_convert_encoding($csv, 'SJIS', mb_internal_encoding());
// ファイルポインタを閉じる
fclose($fp);
// 指定したファイル名の拡張子やパスを取り除く
$fileName = basename($fileName);
// ダウンロード用のヘッダーを出力
header('Content-Disposition:attachment; filename="'.$fileName.'.csv"');
header('Content-Type:application/octet-stream');
header('Content-Length:'.strlen($csv));
echo $csv;
die();
}
$fileName:保存したいファイル名を指定
$data:CSVファイルに書き込みたいデータを連想配列で指定
$header:先頭行に配置するデータを配列で指定(1行分)
以下渡すデータの例。
// ヘッダー(先頭行) $header = array( 'name_1', 'name_2', 'name_3', 'name_4', 'name_5', ); // データ部分(基本foreachで回す) $data[] = array( 'col_data_1', 'col_data_2', 'col_data_3', 'col_data_4', 'col_data_5' ); $data[] = array( 'col_data_1', 'col_data_2', 'col_data_3', 'col_data_4', 'col_data_5' );
よく使うレスポンスメモ。
// 301 Moved Permanently
header('Location: http://example.com/', true, 301);
// 302 Found
header('Location: http://example.com/', true, 302);
header('Location: http://example.com/');
// 303 See Other
header('Location: http://example.com/', true, 303);
// 307 Temporary Redirect
header('Location: http://example.com/', true, 307);
// 400 Bad Request
header('HTTP', true, 400);
// 403 Forbidden
header('HTTP', true, 403);
// 404 Not Found
header('HTTP', true, 404);
// 500 Internal Server Error
header('HTTP', true, 500);
// 501 Method Not Implemented
header('HTTP', true, 501);
// 502 Bad Gateway
header('HTTP', true, 502);
// 503 Service Temporarily Unavailable
header('HTTP', true, 503);
// 504 Gateway Time-out
header('HTTP', true, 504);
// 505 HTTP Version Not Supported
header('HTTP', true, 505);
といいつつ後半めったに使わない件。笑
自分用。
以下の変数を用いて実験。
※$hは未定義とする
$a = null; $b = 0; $c = '0'; $d = array(); $e = ''; $f = true; $g = false; // $h
まずはisset()。
var_dump(isset($a)); var_dump(isset($b)); var_dump(isset($c)); var_dump(isset($d)); var_dump(isset($e)); var_dump(isset($f)); var_dump(isset($g)); var_dump(isset($h)); ↓ bool(false) bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) bool(false)
isset()は「null」、「未定義」の場合のみ「false」。
次にempty()。
var_dump(empty($a)); var_dump(empty($b)); var_dump(empty($c)); var_dump(empty($d)); var_dump(empty($e)); var_dump(empty($f)); var_dump(empty($g)); var_dump(empty($h)); ↓ bool(true) bool(true) bool(true) bool(true) bool(true) bool(false) bool(true) bool(true)
empty()は「true」の場合のみ「false」を返却という結果に。
ということで結果を表にまとめてみた。
| 値 | isset() | empty() |
|---|---|---|
| null | bool(false) | bool(true) |
| 0 | bool(true) | bool(true) |
| ‘0’ | bool(true) | bool(true) |
| array() | bool(true) | bool(true) |
| ” | bool(true) | bool(true) |
| true | bool(true) | bool(false) |
| false | bool(true) | bool(true) |
| 未定義 | bool(false) | bool(true) |
変数未定義のempty()もエラー吐かずにtrue返してくれるのね。ためになっt(ry
コントローラー内でModelクラス内のメソッドを補完させる方法と、ビューファイル(.ctp)内でViewクラスのメソッドを補完させる方法。
まずコントローラーにて。
/**
* @property Item $Item
*/
class ExamplesController extends AppController {
}
コントローラークラスの上部にコメントアウトで@propertyを記述してやることで、Eclipaseがモデル内のメソッドを自動で補完してくれるようになる。複数のモデルを一括で指定したい場合はコメントアウト内に@propertyを列挙してあげればよい。
※コメントアウトをクラス内に記述してしまうと全く動作しないので注意。
/**
* @property Item $Item
* @property Hoge $Hoge
* @property Fuga $Fuga
* @property Piyo $Piyo
*/
class ExamplesController extends AppController {
}
次にビュー。
<?php /* @var $this View*/ ?>
「.ctp」内の先頭行に上記1行を記述してやればよい。
※予め「.ctp」をPHPファイルとしてEclipseに認識させておかないと補完されないので注意。
たったこれだけでCakePHPでの開発が数倍快適になること間違いなし。
でましたね。っていっても8月30日ですけど!
主なフィックスは、バージョン3.0に向けて機能の整理、及び安定性と性能を強化、とのこと。
今日のPHPカンファレンス参加して思ったけど、やっぱりCake人工多いね。圧倒的だね。熱いね。ほんと下気圧。もう変換ミスも気にならないくらい激熱。
PHPフレームワークも乱立する時代になって、ざっと数えただけでも8個くらいあるけども、やっぱりCakeのとっつきやすさはダントツな気がする。日本語ドキュメントも充実してて、転がってるエントリも多い。やっぱりCakeが大好きです。
そして会場にて勢いで買ったやーつー。
最近Cakeに触れてなさ過ぎて禁断症状出そう。いい加減社内オレオレフレームワークじゃなくてOSS使わせてくださいお願いします。切実に。