Php 如何生成5位字母数字顺序字符串
我可以得到5位字母数字顺序字符串的逻辑吗 如果数字在00001-99999之间,我们可以显示相同的数字,但当达到99999时,应该显示A00001,而不是100000。同样,在A9999之后,它应该是B0001 您是否有这样做的逻辑。这应该可以:Php 如何生成5位字母数字顺序字符串,php,logic,Php,Logic,我可以得到5位字母数字顺序字符串的逻辑吗 如果数字在00001-99999之间,我们可以显示相同的数字,但当达到99999时,应该显示A00001,而不是100000。同样,在A9999之后,它应该是B0001 您是否有这样做的逻辑。这应该可以: function gencode($prefix='A',$s = '00000000', $n){ return $prefix.substr($s,0, strlen($s) - strlen($n)).$n; } 如果n是您的(最后一个
function gencode($prefix='A',$s = '00000000', $n){
return $prefix.substr($s,0, strlen($s) - strlen($n)).$n;
}
如果
n
是您的(最后一个+1)
项,只需进行一些更改,如验证$s
上的长度,将$n
更改为0,并将前缀更改为“B”我假设您的兴趣是获得一个从0到ZZZZZ的数字序列,您不关心所描述的顺序,实际上,你可以用36为基数
您可以使用PHP自己的方法,该方法允许最多36个数字,如果它达到表示您的值的数字范围,则使用a-z
例如,你应该:
我会把它装在一个干净的盒子里给你:
可能类似这样的操作,将输入字符串转换为基数10([0-9]),将值增加1,再转换回基数36([a-z0-9]),然后返回新值。对于小于10000的数值,它还将该值填充到5个字符
function do_the_thing($string){
return str_pad(base_convert(base_convert($string,36,10)+1,10,36),5,0,STR_PAD_LEFT);
}
测试
echo do_the_thing('a0000');
返回“a0001”
测试后的一些结果:
99999 -> 9999a
a9999 -> a999a
zzzzz -> 100000
不是100%你想要的,而是非常接近。我想这就是你想要的
$input = '10099999';
$i=0;
while($input >= 100000)
{
$input = $input - 100000;
$i++;
}
if($i < 1)
{
echo $input;
}
else
{
if($i >26)
{
$letters = ['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'];
$k="";
$j=0;
while($i > 26)
{
$i=$i-26;
$j++;
}
for($l=0;$l<$j;$l++)
{
$k=$k."".$letters[25];
}
if($input == 0)
$input = "0000";
$input2="";
for($l=$i;$l>$i;$l--)
{
if($input >= (9999/(pow(10,$j))))
$input = $input / 10;
}
$kt=$k."".$letters[$i]."".$input;
echo "".($k)."".$letters[$i]."".floor($input/pow(10,$j));
}
else
{
$s="";
$letters = ['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'];
if($input == 0)
{
echo $letters[$i-1]."0000";
}
else
{
echo $letters[$i-1]."".$input;
}
}
}
$input='10099999';
$i=0;
而($input>=100000)
{
$input=$input-100000;
$i++;
}
如果($i<1)
{
echo$输入;
}
其他的
{
如果($i>26)
{
$letters=['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'];
$k=“”;
$j=0;
而($i>26)
{
$i=$i-26;
$j++;
}
对于($l=0;$l$i;$l--)
{
如果($input>=(9999/(pow(10,$j)))
$input=$input/10;
}
$kt=$k.“”.$letters[$i].“”.$input;
回音“($k)。”.$letters[$i]。”地板($input/pow(10,$j));
}
其他的
{
$s=“”;
$letters=['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'];
如果($input==0)
{
回音$字母[$i-1]“0000”;
}
其他的
{
回显$字母[$i-1]。“”.$input;
}
}
}
OP不希望这样,您可以使用sprint()来代替它,从而获得从A到Z的更好结果吗?事实上,在A9999之后不应该是B0000吗?在ZZZZ之后你想要什么?序列必须是这样的吗?或者如果99后面跟9A,那么最大的数字是ZZZZ,但第10001个数字是7pt,你会很好吗?您可能会有相同数量的组合,但顺序准确,而不是您所描述的。@shemeermali请提供我的评论反馈,人们开始发疯了:请正确阅读问题。OP问我能得到5位字母数字顺序字符串的逻辑吗。
@krishna请正确阅读我的答案。我说他可以使用简单的整数,增加它们,然后使用base_convert来得到他想要的字母数字字符串。我的回答没有错。尽管如此,我还是要为您澄清问题在于,当使用base_convert时,它会更改数字<99999,而您的答案会将a053
更改为a054
,哪个OP不需要。如果我正确,OP需要的是从100000
开始,它应该从A00001
开始显示,数字应该是5位。@krishna如果他想使用字母数字,那么这是正确的。99不再只是99了。9仍然是9,但10最终大于10,因为9之后不是10而是a。当然,他指出的顺序是不同的,但我很确定,他想要的只是字母数字,他只是不太了解它,因此认为99年后它应该是100,只有99999年后它应该是A0000这是我需要的,但它不能正常工作。有一些错误。你能告诉我是什么错误,以便我可以清除它吗?你能测试“2700000”吗?它给出“ZB0”而不是“AA001”。嗨,奎师那,我在下面贴了一个解决方案作为答案。它几乎可以正常工作。谢谢你的帮助。你太棒了:)
echo do_the_thing('a0000');
99999 -> 9999a
a9999 -> a999a
zzzzz -> 100000
$input = '10099999';
$i=0;
while($input >= 100000)
{
$input = $input - 100000;
$i++;
}
if($i < 1)
{
echo $input;
}
else
{
if($i >26)
{
$letters = ['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'];
$k="";
$j=0;
while($i > 26)
{
$i=$i-26;
$j++;
}
for($l=0;$l<$j;$l++)
{
$k=$k."".$letters[25];
}
if($input == 0)
$input = "0000";
$input2="";
for($l=$i;$l>$i;$l--)
{
if($input >= (9999/(pow(10,$j))))
$input = $input / 10;
}
$kt=$k."".$letters[$i]."".$input;
echo "".($k)."".$letters[$i]."".floor($input/pow(10,$j));
}
else
{
$s="";
$letters = ['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'];
if($input == 0)
{
echo $letters[$i-1]."0000";
}
else
{
echo $letters[$i-1]."".$input;
}
}
}
function seq4($input){
$i=0;$var = 'A';
$max_lenght = 5; $length = strlen($input);
if($length>$max_lenght){ while($input >= 10000){
$input = $input - 10000;
$i++; }
$i=$i-9;
while($i > 1){
$i--;
$var++.'';
}
$bal_lenght = $max_lenght - ($str_lenght = strlen($var));
$string = $var.str_pad($input, $bal_lenght, "0", STR_PAD_LEFT);
$string_lenght = strlen($string);
return ($string_lenght>$max_lenght)?false:$string; } else {
return str_pad($input, 5, "0", STR_PAD_LEFT); } }