『 オブジェクトをマージするPHPのメモ 』

2009 年 4 月 21 日

[{a:"1", b:"2", c:"3"} , {d:"hoge", a:"fuga"}] のような構造体の配列をマージして {a:”fuga”, b:”2″, c:”3″, d:”hoge”} としてくれるPHPコードのメモ。変数名がバッティングした場合は後の方に上書きされる。入れ子の構造体には使えない、多分。

<?php
function merge_object($obj_ary) {

    $joined = array();
    $n = count($obj_ary);

    if ($n == 0) return "{}";
    if ($n == 1) return $obj_ary[0];

    for ($i = 0; $i < $n; ++$i) {

        $o = $obj_ary[$i];
        $o = preg_replace("/&#8217;|&#8242;|&#8221;|&#8243;/", "\"", $o);

        //適当
        preg_match("/\s*[{]\s*(.*)\s*[}]\s*/", stripslashes($o), $match);
        $pairs = preg_split("/\s*,\s*/", $match[1]);

        foreach($pairs as $v) {
            if (strcmp($v, "") == 0) continue;

            $pair = preg_split("/\s*:\s*/", $v);
            $joined[$pair[0]] = $pair[1];
        }
    }

    while(list($key, $value) = each($joined)) {
        $result .= $key.":".$value.",";
    }
    $result = "{".substr($result, 0, strlen($result) - 1)."}";

    return $result;
}

//間にスペースが入っても平気
$test[0] = '{aaa:"bbb"  ,  ccc  :  "ddd"  ,  a  :  "b"}';
$test[1] = '{    aaa:"123",  eee:"fff"  }';

print merge_object($test);
?>

出力結果

{aaa:"123",ccc:"ddd",a:"b",eee:"fff" }

なんかところどころに半角スペースが残ってるのが気になる、まあいいけど。

« 
» 

Leave a Reply