优化生成 IBAN 的 PHP 脚本
Posted
技术标签:
【中文标题】优化生成 IBAN 的 PHP 脚本【英文标题】:Optimize PHP script for generating IBAN 【发布时间】:2014-02-05 10:21:17 【问题描述】:我用 php 编写了为给定银行帐户生成克罗地亚语 IBAN 的函数。我可以轻松地重写以返回任何 IBAN。问题是我认为它既不优化也不优雅。这是函数:
function IBAN_generator($acc)
if(strlen($acc)!=23)
return;
$temp_str=substr($acc,0,3);
$remainder =$temp_str % 97;
for($i=3;$i<=22;$i++)
$remainder =$remainder .substr($acc,$i,1);
$remainder = $remainder % 97;
$con_num = 98 - $remainder;
if ($con_num<10)
$con_num="0".$con_num;
$IBAN="HR".$con_num.substr($acc,0,17);
return $IBAN;
有没有更好的方法来生成 IBAN?
【问题讨论】:
您面临的具体问题是什么?需要生成大量代码吗? 【参考方案1】:乍一看似乎你不能让它更快,它只是简单的字符串附加序列。 除非你必须使用它数千次并且这对你的应用程序来说是一个瓶颈,否则我不会浪费时间让它变得更好,它可能需要几微秒,并且仅仅升级 PHP 版本可能会比代码更改更好地改进你会实施的。
如果您真的必须加快速度,可能的解决方案是 - 将函数写入扩展 - APC 操作代码缓存(在解释代码时它应该使事情通常更快,因此全局提高速度) - 在内存中缓存结果(仅当您的应用程序多次运行相同的输入时,对于像这样的简单算法来说,这可能不是常见的情况)
如果你想玩它并尝试让它更快、更小心,你可以改变逻辑并引入一个错误。始终使用单元测试,或者在更改之前编写一些测试用例,这始终是一个好习惯
【讨论】:
【参考方案2】:你可以看看这个 repo:
https://github.com/jschaedl/Iban
您的职责是为克罗地亚添加规则。 之后,您应该可以在您的国家/地区使用它。
问候
【讨论】:
【参考方案3】:为了进行微优化,substr
的时间复杂度为 O(n),因此您的循环的时间复杂度为 O(n2)。为避免这种情况,请使用str_split 并按索引访问生成数组的字符。
然后,为了更优雅,可以将 for 循环替换为array_reduce。
另外,通常避免在循环中连接字符串,它具有 O(n2) 时间和内存复杂度。 IBAN 很短,PHP 不在微型计算机上运行,所以这里不是问题。但是,如果您曾经使用过更长的字符串,请生成一个数组,然后 implode it*。
当然,如果你在=
周围和for/if
之后的间距保持一致,它也会更优雅;-)
* 在 javascript 中,我曾经尝试通过迭代字符串连接来生成韩文字母的 html 表。它使浏览器崩溃,消耗 1GB+ 内存。
【讨论】:
以上是关于优化生成 IBAN 的 PHP 脚本的主要内容,如果未能解决你的问题,请参考以下文章