PHP

【PHP】mb_convert_encoding()のautoは使うな。

もし使いたいなら下記のように指定すること。

$str = mb_convert_encoding($str, 'UTF-8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS,SJIS-WIN');

autoはphp.iniの言語設定によって展開される文字コードが変化するため、上記のような結果が確実に得られるという保証が無い。
そのため、上記を想定してautoを渡しても期待通りの結果にならない場合があるので、しっかりと指定したほうが無難である。

php.iniのmbstring.languageが「mbstring.language=Japanese」になっているか、前もって「mb_language(‘Japanese’)」を実行していれば問題は無い。

 

【PHP】小数点を任意の桁数で四捨五入する。

めも。

// 少数点第3位を四捨五入する。
echo sprintf('%.3f', 9.9996);
// 10.000

 

【PHP】array_unique()はインデックスを振りなおしてくれない。

ので、振り直したい時はこうする。

array_merge(array_unique($array));

マージさせればいいんだね。

 

【CakePHP2.4】jsonpでビューを出力する。

CakePHP2.4以降からjsonp出力がサポートされたのでやってみる。

// コントローラー内のメソッド
public function index {
	// 出力したいデータ
	$result = ['hoge', 'piyo', 'fuga'];
	$this->viewClass = 'Json';
	$this->set([
		'result' => $result,
		'_serialize' => ['result'],
		// 下記変数をセットすると出力がjsonpになる。
		'_jsonp' => true
	]);
}

呼び出しの際は、上記メソッドにアクセスし、クエリストリングで「?callback=functionName」を渡す。
※functionNameは任意の関数名。

これでレスポンスヘッダの「Content-Type」も「application/Javascript:」になってくれる。

 

【PHP】文字列内から電話番号(と思わしき数列)を抽出する。

必要だったので作成。
※基本的に国内電話番号のフォーマット用

function getTelNumber($html) {
	// 全角スペースを半角に、全角数字を半角に
	$_source = mb_convert_kana($html, 'ns');
	// 置換文字列の定義と処理
	$replacePts = [
		['from' => ['(', ')'], 'to' => ['(', ')']],// 全角括弧を半角に
		['from' => ' ', 'to' => ''],// スペースエンティティを削除
		['from' => ['ー', '―', '‐', '?'], 'to' => '-'],// ハイフン(と思われるもの)を置換
	];
	foreach($replacePts as $pts) {
		$_source = str_replace($pts['from'], $pts['to'], $_source);
	}
	// 電話番号のパターンを定義
	$telNumberPts = [
		'/0\d{5}-\d{4}/x',// ハイフン1個
		'/0\d{1,4}-\d{1,4}-\d{4}/x',// ハイフン2個
		'/0\d{1,4}\(\d{1,4}\)\d{4}/x',// 中間括弧パターン
		'/\(0\d{1,4}\)\d{1,4}-\d{4}/x'// 先頭括弧パターン
	];
	$return = [];
	foreach($telNumberPts as $key => $pts) {
		preg_match_all($pts, $_source , $m);
		if(!empty($m[0])) {
			$return = array_merge($return, $m[0]);
		}
	}
	return array_unique($return);
}

上記関数の引数に調査したい文字列を渡せばOK。
HTMLをぶん投げる想定で作成。
まだまだ甘いと思うので、今後随時アップデート予定。

 

【PHP】str_replace()の挙動めも。

str_replace()に配列を渡した際の挙動が面白かったのでメモ。

下記コードを実行すると結果は「B」ではなく「F」となる。

$search  = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';
echo str_replace($search, $replace, $subject);

上記の場合「A」の置換文字列としてマッピングされているものは「B」であるが、
「B」に置換されたあと、すかさず「C」に置換されるため、
この挙動が連鎖していき最終的に「F」となる。

str_replace()は左から順番に処理されていくんだね!

 

【PHP】片方の配列値をキーにもう片方の配列値をバリューとして新たな配列を生成する。

配列をキーとバリューでがっちゃんこしたい時。

$array1 =[
	'k1', 'k2', 'k3', 'k4'
];

$array2 =[
	'v1', 'v2', 'v3', 'v4'
];

$combine = array_combine($array1, $array2);

var_dump($combine);
die();

↓

array(4) {
  ["k1"]=>
  string(2) "v1"
  ["k2"]=>
  string(2) "v2"
  ["k3"]=>
  string(2) "v3"
  ["k4"]=>
  string(2) "v4"
}

要素数が一致しなかった場合、E_WARNINGが発生するので注意されたし。

 

【PHP】mb_convert_kana()にはオプションをまとめて複数渡せる。

ということを初めて知った。

下記例。

// a, s, K, Vオプションをまとめて渡す。
mb_convert_kana('asKV');

これは便利。