【发布时间】:2016-10-20 21:14:34
【问题描述】:
因为 MYSQL 的“SELECT”选择整数和浮点数作为字符串,并且我需要(从 JS)获得的每个响应都在正确的数据模型中 -
- 1 不是“1”,
- 53.2 不是“53.2”,
我创建了这个适用于混合类型 - 数组/对象的递归函数:
private function cast_number(&$mixed) {
if(is_array($mixed)) {
foreach ($mixed as $key => $val)
if (is_numeric($val))
$mixed[$key] = (double)$val;
else if (is_array($val) || is_object($val))
$mixed[$key] = $this->cast_number($val);
} else if(is_object($mixed)) {
foreach ($mixed as $key => $val)
if (is_numeric($val))
$mixed->$key = (double)$val;
else if (is_array($val) || is_object($val))
$mixed->$key = $this->cast_number($val);
}
return $mixed;
}
非常简单的函数 - 如果是数字,则强制转换为双精度,如果是数组或对象,则递归遍历。
这里一切就绪。
我有两个问题: - 在 6MB 的数据上,大部分以字符串表示的数字需要 0.5 秒 - 在 200MB 的数据上(是的,我需要它,请不要关注它),它在几分钟(通常是几秒钟)后失败,说它需要超过 4GB 的内存..
- 如何改进此功能? (速度、记忆力)
- 为什么需要这么长时间?甚至 json_encode,我认为更大的功能需要更少的时间..
【问题讨论】:
-
您是否尝试过输入杂耍:
$mixed[$key] = 0 + $val;? -
@IvanGabriele 还没有。我不明白这对速度有什么帮助?当然,内存几乎是 4 个字节,而不是大多数时候的 8 个。现在正在尝试
-
您的问题还有另一种解决方案。这是在服务器上更新 mysqlnd,以便 PHP 从 MySQL 中获取正确的数据类型...Here's more info
-
您可能还想与codereview.stackexchange.com的人们核实
-
@Amit 我给了你一个完整的答案,向你展示不同的时间,你可以看到,如果通过引用结合变量,它会大大降低执行时间。
标签: php mysql performance recursion memory-management