1

我用 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?

4

3 回答 3

1

乍一看,您似乎无法让它更快,它只是简单的字符串附加序列。除非你必须使用它数千次并且这对你的应用程序来说是一个瓶颈,否则我不会浪费时间让它变得更好,它可能需要几微秒,并且仅仅升级 PHP 版本可能会比代码更改更好地改进你会实施。

如果你真的必须让它更快,可能的解决方案是 - 将函数写入扩展 - APC操作代码缓存(在解释代码时它应该使事情通常更快,因此全局提高速度) - 缓存导致内存(仅当您的应用程序多次运行相同的输入,对于像这样的简单算法来说,这可能不是常见的情况)

如果你想玩它并尝试让它更快、更小心,你可以改变逻辑并引入一个错误。始终使用单元测试,或在更改之前编写一些测试用例,始终是一个好习惯

于 2014-01-16T13:33:47.617 回答
0

你可以看看这个 repo:

https://github.com/jschaedl/Iban

你的职责是为克罗地亚添加规则。之后,您应该可以在您的国家/地区使用它。

格雷茨

于 2014-02-25T10:21:12.420 回答
0

要进行微优化,substr时间复杂度为 O(n),因此您的循环具有 O(n 2 )。为避免这种情况,请使用str_split并按索引访问生成数组的字符。

然后,为了更优雅,可以将 for 循环替换为array_reduce

此外,通常避免循环中的字符串连接,它具有 O(n 2 ) 时间和内存复杂度。IBAN 很短,PHP 不在微型计算机上运行,​​所以这里不是问题。但是,如果您曾经使用过更长的字符串,请生成一个数组,然后将其内爆*。

=而且,当然,如果您与前后的间距保持一致for/if,它也会更优雅;-)


* 在 Javascript 中,我曾经尝试通过迭代字符串连接来生成韩文字母的 HTML 表。它使浏览器崩溃,消耗 1GB+ 内存。
于 2021-10-11T08:02:03.337 回答