對象原有屬性值全部是大寫,需求是將對象的屬性值全部轉化成小寫麼。 通常思路是 對象轉化成數組(遍曆轉化成小寫)再轉化成對象 這樣的思路很繁瑣遞迴資料來源且效率低求高效思路或方法stdClass Object( [INFO] => stdClass Object ( [A] => 1 [B] => 2 [C] => 3 [C] => 4 [D] => stdClass Object ( [AA] => 11 [BB] => 22 [CC] => 33 [CC] => 44 ) ))
回複討論(解決方案)
對象不可能出現同名屬性,請調整一下
對象不可能出現同名屬性,請調整一下
stdClass Object( [INFO] => stdClass Object ( [A] => 1 [B] => 2 [C] => 3 [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 把字串轉為對象。