当前位置: 代码迷 >> PHP >> 算法题。该怎么解决
  详细解决方案

算法题。该怎么解决

热度:73   发布时间:2016-04-28 19:09:39.0
算法题。
对象原有属性值全部是大写,需求是将对象的属性值全部转化成小写么。 
通常思路是  对象转化成数组(遍历转化成小写)再转化成对象  这样的思路很繁琐递归数据源且效率低
求高效思路或方法
stdClass Object
(
    [INFO] => stdClass Object
        (
            [A] => 1
            [B] => 2
            [C] => 3
            [C] => 4
            [D] => stdClass Object
                (
                    [AA] => 11
                    [BB] => 22
                    [CC] => 33
                    [CC] => 44
                )

        )

)

------解决方案--------------------
对象不可能出现同名属性,请调整一下
------解决方案--------------------
转化为数组了过后可以用spl中的数组迭代器来遍历,不知道速度会不会快一点
------解决方案--------------------
不是很明白为什么要有这样的需求,可以这样写
$s = '{"A":1,"B":2,"C":3,"D":{"AA":11,"BB":22,"CC":33}}';
$o = json_decode($s); //模拟一个对象

$t = serialize($o);
$t = preg_replace_callback('/("[A-Z]+")(;.+?;)/', function($r) { return strtolower($r[1]) . $r[2]; }, $t);
$o = unserialize($t);

print_r($o);
stdClass Object
(
    [a] => 1
    [b] => 2
    [c] => 3
    [d] => stdClass Object
        (
            [aa] => 11
            [bb] => 22
            [cc] => 33
        )
)


如果真是 json 则可写作
$s = '{"A":1,"B":2,"C":3,"D":{"AA":11,"BB":22,"CC":33}}';
$s = preg_replace_callback('/"[A-Z]+":/', function($r) { return strtolower($r[0]); }, $s);
print_r(json_decode($s));
stdClass Object
(
    [a] => 1
    [b] => 2
    [c] => 3
    [d] => stdClass Object
        (
            [aa] => 11
            [bb] => 22
            [cc] => 33
        )

)

------解决方案--------------------
1.先json_encode把对象转字符串
2.使用preg_replace_callback 调用 strtolower把 "*": 转为小写,相当于把遍历改成正则替换。
3.json_decode 把字符串转为对象。


<?php
$s = '{"A":1,"B":2,"C":3,"D":{"AA":11,"BB":22,"CC":33}}';
$obj = json_decode($s);

print_r($obj);

$str = json_encode($obj);
$str = preg_replace_callback('/"(.*?)":/', 'tolower', $str);
$obj = json_decode($str);

print_r($obj);

function tolower($matches){
    return '"'.strtolower($matches[1]).'":';
}
?>
  相关解决方案