我目前优化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