『 オブジェクトをマージする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("/’|′|”|″/", "\"", $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" }
なんかところどころに半角スペースが残ってるのが気になる、まあいいけど。