我目前優化PHP應用程序,發現一個功能周圍10-20K次被調用,所以我想我會那裏開始優化:鍵轉換爲小寫
function keysToLower($obj)
{
if(!is_object($obj) && !is_array($obj)) return $obj;
foreach($obj as $key=>$element)
{
$element=keysToLower($element);
if(is_object($obj))
{
$obj->{strtolower($key)}=$element;
if(!ctype_lower($key)) unset($obj->{$key});
}
else if(is_array($obj) && ctype_upper($key))
{
$obj[strtolower($key)]=$element;
unset($obj[$key]);
}
}
return $obj;
}
大部分時間都花在遞歸調用中(這在PHP中很慢),但我沒有看到任何將它轉換爲循環的方法。 你會做什麼?
該版本沒有考慮關聯數組,因爲我的數據沒有任何數據,但速度比原始版本快近10倍。大部分工作都由Gumbo完成,主要的加速來自於使用引用和創建新對象,而不是取消舊密鑰的設置。
function &keysToLower(&$obj)
{
if(is_object($obj))
{
$newobj = (object) array();
foreach ($obj as $key => &$val)
$newobj->{strtolower($key)} = keysToLower($val);
$obj=$newobj;
}
else if(is_array($obj))
foreach($obj as &$value)
keysToLower($value);
return $obj;
}
您總是可以使用輔助堆棧輕鬆刪除遞歸調用。 – Artefacto 2010-06-05 18:16:56
我建議array_walk_recursive,但刪除了我的帖子 - 我不能輕易地讓它做你想做的事,儘管你可能想自己看看這個功能。 – Erik 2010-06-05 18:18:53
顯然array_walk_recursive不會考慮使用回調函數創建的元素。 – tstenner 2010-06-05 18:29:20