hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

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