算法题。
1 | 对象原有属性值全部是大写,需求是将对象的属性值全部转化成小写么。 <br />通常思路是 对象转化成数组(遍历转化成小写)再转化成对象 这样的思路很繁琐递归数据源且效率低<br />求高效思路或方法<br />stdClass Object<br />(<br /> [INFO] => stdClass Object<br /> (<br /> [A] => 1<br /> [B] => 2<br /> [C] => 3<br /> [C] => 4<br /> [D] => stdClass Object<br /> (<br /> [AA] => 11<br /> [BB] => 22<br /> [CC] => 33<br /> [CC] => 44<br /> )<br /><br /> )<br /><br />)<br />
|
Salin selepas log masuk
------解决方案--------------------对象不可能出现同名属性,请调整一下
------解决方案--------------------转化为数组了过后可以用spl中的数组迭代器来遍历,不知道速度会不会快一点
------解决方案--------------------不是很明白为什么要有这样的需求,可以这样写
1 | $s = '{"A":1,"B":2,"C":3,"D":{"AA":11,"BB":22,"CC":33}}' ;<br /> $o = json_decode( $s );
|
Salin selepas log masuk
1 | stdClass Object<br />(<br /> [a] => 1<br /> [b] => 2<br /> [c] => 3<br /> [d] => stdClass Object<br /> (<br /> [aa] => 11<br /> [bb] => 22<br /> [cc] => 33<br /> )<br />)<br />
|
Salin selepas log masuk
如果真是 json 则可写作
1 | $s = '{"A":1,"B":2,"C":3,"D":{"AA":11,"BB":22,"CC":33}}' ;<br /> $s = preg_replace_callback( '/"[A-Z]+":/' , function ( $r ) { return strtolower ( $r [0]); }, $s );<br />print_r(json_decode( $s ));<br />
|
Salin selepas log masuk
1 | stdClass Object<br />(<br /> [a] => 1<br /> [b] => 2<br /> [c] => 3<br /> [d] => stdClass Object<br /> (<br /> [aa] => 11<br /> [bb] => 22<br /> [cc] => 33<br /> )<br /><br />)<br />
|
Salin selepas log masuk
------解决方案--------------------1.先json_encode把对象转字符串
2.使用preg_replace_callback 调用 strtolower把 "*": 转为小写,相当于把遍历改成正则替换。
3.json_decode 把字符串转为对象。
1 | <br /><?php<br /> $s = '{"A":1,"B":2,"C":3,"D":{"AA":11,"BB":22,"CC":33}}' ;<br /> $obj = json_decode( $s );<br /><br />print_r( $obj );<br /><br /> $str = json_encode( $obj );<br /> $str = preg_replace_callback( '/"(.*?)":/' , 'tolower' , $str );<br /> $obj = json_decode( $str );<br /><br />print_r( $obj );<br /><br /> function tolower( $matches ){<br /> return '"' . strtolower ( $matches [1]). '":' ;<br />}<br />?><br />
|
Salin selepas log masuk