php 将多维数组的键名递归全部转为小写,php – 将数组/对象树的键转换为小写...

本文探讨了如何优化一个在PHP中被大量调用的函数,特别是针对对象和数组的键进行转换。通过使用递归和循环的不同实现,作者展示了如何减少函数调用的开销,提高应用程序的性能。提供的解决方案包括使用引用和创建新对象来避免旧键的取消,以及使用`foreach`循环的不同策略。这些方法在不处理关联数组的情况下,显著提升了代码执行速度。
摘要由CSDN通过智能技术生成

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

}

标签:php,performance

来源: https://codeday.me/bug/20190715/1463575.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值