我目前正在优化一个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;
}