PHPでハッシュ配列をJSON形式の文字列に変換する関数
PHPでハッシュ配列をJSON形式の文字列に変換する関数を作ってみました。
通常、PHPで配列をJSON形式に変換するには「json_encode」を使用するのですが、この関数は「UTF-8 エンコードされたデータでのみ動作」という制約があるため、SJISの場合などは使用できません。
今回個人的にUTF-8以外(SJIS)で処理を行わなければならない事があったため、id:kovaioさんとid:fbisさんのブログを参考にして、自前で関数を作成してみました。
ハッシュ配列型かどうかを判定する関数
実装するにあたって、普通の配列とハッシュ配列を判定したかったので、id:fbisさんのブログにあった「is_hash」を使わせていただきました。
ハッシュ配列かどうかの判定方法はいろいろとあるようで、とても参考になります。
以下が使わせていただいたソースコードになります。
配列か連想配列かを判別する - Unknown::Programmingより
<?php /** * hash配列かどうかの判定 */ function is_hash(&$array) { $i = 0; foreach($array as $k => $dummy) { if ( $k !== $i++ ) return true; } return false; } ?>
ハッシュ配列をJSON文字列に変換する関数
本題のハッシュ配列からJSONの生成ですが、こちらはid:kovaioさんのブログに掲載されていた関数を参考に、自分なりに実装してみています。
「json_encode」で変換されるのと同じJSON文字列になるように実装してみました。
hash配列からJSON文字列の生成する関数(ソースコード)
<?php /** * hash配列からJSON文字列の生成 */ function hashToJson($hash) { $json = array(); list($fmKey,$fmTag) = ( is_hash($hash) ) ? array('"%s":','{%s}') : array('','[%s]'); foreach($hash as $key => $val){ $key = sprintf($fmKey, $key); if( is_array($val) ){ $json[] = $key . hashToJson($val); }elseif( is_string($val) ){ $json[] = $key . sprintf('"%s"', $val); }else{ $json[] = $key . sprintf('%s', $val); } } return sprintf($fmTag, implode(",",$json)); } ?>
対応できていない事
- 配列のキーまたは値として「\n」「\t」「\"」などが設定されている場合、そのままの文字列として扱えない。
今回参考にしたページ
[PHP] 配列 から JSON へ変換する関数 - 仕事メモ
http://d.hatena.ne.jp/kovaio/20060610
配列か連想配列かを判別する - Unknown::Programming
http://d.hatena.ne.jp/fbis/20091112/1258002754
PHP: json_encode - Manual
http://php.net/manual/en/function.json-encode.php