【发布时间】:2011-12-01 14:57:05
【问题描述】:
所以我有这个功能:
function toAlpha($data){
$alphabet = array('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');
$alpha_flip = array_flip($alphabet);
if($data <= 25){
return $alphabet[$data];
}
elseif($data > 25){
$dividend = ($data + 1);
$alpha = '';
$modulo;
while ($dividend > 0){
$modulo = ($dividend - 1) % 26;
$alpha = $alphabet[$modulo] . $alpha;
$dividend = floor((($dividend - $modulo) / 26));
}
return $alpha;
}
}
给定一个数字将其转换为字符并且可以正常工作
但是我也想要一个反向函数,给定这个函数的任何输出,返回产生该输出的确切输入,我尝试了这个:
function toNum($data){
$alphabet = array('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');
$alpha_flip = array_flip($alphabet);
if(strlen($data) == 1){
return (isset($alpha_flip[$data]) ? $alpha_flip[$data] : FALSE);
}
else if(strlen($data) > 1){
$num = 1;
for($i = 0; $i < strlen($data); $i++){
if(($i + 1) < strlen($data)){
$num *= (26 * ($alpha_flip[$data[$i]] + 1));
}
else{
$num += ($alpha_flip[$data[$i]] + 1);
}
}
return ($num + 25);
}
}
但它不能正常工作...toAlpha(728) 正在生成 'aba' 但 toNum('aba') 正在生成 1378 而不是 728...
我做错了什么?如何修复反向功能使其正常工作?
提前致谢!
【问题讨论】:
-
所以你正在尝试将一个以 10 为底的数字转换为以 26 为底的数字,是这样吗?
-
原来的 toAlpha 函数应该做什么?如果数字超过 25,期望的行为是什么?
-
变成双字母、三字母等 eg: 26 = aa, 27 = ab, etc
-
如果'a'是你的0,那么aa不应该也是0吗?至少,如果您只是尝试使用字母而不是数字来实现直接 base-26。
-
这两个函数的期望结果真的不清楚。你能解释一下这些函数应该准确输出什么以及遵循什么规则吗?
标签: php string function math reverse