php – 将数组/对象树的键转换为小写
发布时间:2020-12-13 22:07:24 所属栏目:PHP教程 来源:网络整理
导读:我目前正在优化 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_obj
我目前正在优化
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; } 解决方法
Foreach正在使用随后遍历的内部副本.试试吧:
function keysToLower($obj) { $type = (int) is_object($obj) - (int) is_array($obj); if ($type === 0) return $obj; reset($obj); while (($key = key($obj)) !== null) { $element = keysToLower(current($obj)); switch ($type) { case 1: if (!is_int($key) && $key !== ($keyLowercase = strtolower($key))) { unset($obj->{$key}); $key = $keyLowercase; } $obj->{$key} = $element; break; case -1: if (!is_int($key) && $key !== ($keyLowercase = strtolower($key))) { unset($obj[$key]); $key = $keyLowercase; } $obj[$key] = $element; break; } next($obj); } return $obj; } 或使用引用来避免使用副本: function &keysToLower(&$obj) { $type = (int) is_object($obj) - (int) is_array($obj); if ($type === 0) return $obj; foreach ($obj as $key => &$val) { $element = keysToLower($val); switch ($type) { case 1: if (!is_int($key) && $key !== ($keyLowercase = strtolower($key))) { unset($obj->{$key}); $key = $keyLowercase; } $obj->{$key} = $element; break; case -1: if (!is_int($key) && $key !== ($keyLowercase = strtolower($key))) { unset($obj[$key]); $key = $keyLowercase; } $obj[$key] = $element; break; } } return $obj; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |