【发布时间】:2010-07-07 23:59:46
【问题描述】:
我正在为我正在学习 php 的项目编写一个 url 缩短函数,这是代码(顺便说一句,我认为 global 这里不是一件好事:P):
$alphabet = array(1 => "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"0","1","2","3","4","5","6","7","8","9","_","-");
function shorten($id){
global $alphabet;
$shortenedId = "";
while($id>0){
$remainder = $id % 64;
$id = $id / 64;
$shortenedId = $alphabet[$remainder].$shortenedId;
}
return $shortenedId;
}
代码取自this Wikipedia article,适配php。我的问题是,当我将 64 的倍数传递给函数时,我得到了错误的(出于我的目的)结果,例如 128 返回的 b 不正确,它应该是 aaa,但对于 3 位数字来说太长了号码。
另外我开始认为这段代码有问题,如果我将 1'000'000'000'000 作为$id 传递,我会得到 nItOq... 我觉得这是错误的,因为像这样的 url 缩短服务bit.ly 如果我使用它返回一个 6 数字的 id,我认为这个算法并不比他们的更好。
那么,两个问题:
- 您发现上述代码中有任何错误吗?
- 如何管理 64 多个 id?我是否必须忽略它们并传递给下一个?
【问题讨论】:
-
你不需要在那里使用 global (我看不出有什么理由吗?)。事实上,多年来不建议在 PHP 中使用全局变量(至少从 PHP5 的第一个版本开始)。改用依赖注入。
-
@Richard Knop:没有那个变量
$alphabet是无法访问的。 -
哦,好吧,我现在明白了,范围已经改变,因为你在一个函数中。但是为什么不直接将 $alphabet 作为第二个参数传递给函数呢?真的,不建议在 PHP 中使用全局变量。
-
嗯,好吧,我想我会像 nathan 一样把它放在函数中。
-
在提出这个问题时,我们没有code review 站点。如果有人想要审查他们的代码,我们现在就这样做
标签: php url-shortener