加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读