我正在创建一个类似于MySql自动增量的函数,但我使用的是值数组
$array = 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',
'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','P','Q','R','S','T','U','V','W','X','Y','Z',
'1','2','3','4','5','6','7','8','9','0',
'~',-','_');
我想根据这个数组得到下一个字符串。假设我有"aH?"
,所以我的下一个字符串应该是"aIa"
或者我的字符串是"???"
所以我的嵌套字符串应该是"aaaa"
。请建议我最好和最快的方法。
答案 0 :(得分:8)
我认为实际中最好的方法是在PHP中使用鲜为人知的自动增量属性:它也可以用于字符串:
$a = 'a';
echo ++$a; // 'b'
echo ++$a; // 'c'
$a = 'z';
echo ++$a; // 'aa'
echo ++$a; // 'ab'
$a = 'az';
echo ++$a; // 'ba'
echo ++$a; // 'bb'
$a = 'zz';
echo ++$a; // 'aaa'
echo ++$a; // 'aab'
事实上,人们甚至可以混合使用字母和数字,如下所示:
$ld = 'a9z9';
echo ++$ld; // 'b0a0'
$ld = 'z9z9';
echo ++$ld; // 'aa0a0'
如您所见,如果出现溢出(++9
,++z
),下一个符号(从右到左)也会递增。如果它是最左边的(并且等于z
),则它变为'aa'。
最后要说的是:案件得以保留。所以...
$mixin = 'Zz9Zz9Zz9';
echo ++$mixin; // 'AAa0Aa0Aa0'
答案 1 :(得分:2)
另一种选择是这样的(如果你只想让值自动递增然后显示):
<?php
// Set the value of the initial string:
$a = 'a';
// Set the value of the maximum string:
$zzz = 'zzz';
// "Assign $i to $a; while $i is less than the value of $zzz; auto-increment $i;"
for ($i = $a; $i < $zzz; $i++) {
// Print the incremented value ($i)
// Print an HTML break (<br/>) for screen formatting
// Print a new line (\n) for when you view the source code
print $i . "<br/>\n";
}
?>
答案 2 :(得分:0)
这可能不是处理它的最优雅的方法,但是如果你真的需要使用提供的数组,这个函数可以帮助你:
function getNext($s, $array) {
static $remember;
$last = substr($s, -1);
$key = array_search($last, $array);
if ($s === "") {
$remember .= "a";
return $remember;
} else if (isset($array[$key+1])) {
return substr_replace($s, $array[$key+1], -1) . $remember;
} else {
$remember .= "a";
return getNext(substr($s, 0, -1), $array);
}
}
一些输出示例:
echo getNext("abcd", $array); //abce
echo getNext("??a?", $array); //??ba
echo getNext("???", $array); //aaaa
echo getNext("abc??", $array); //abdaa
答案 3 :(得分:0)
我喜欢Ziarno的代码,但如果您更喜欢非递归版本,那么我的代码是
function inc( $l_str ){
$alpha = 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
if( $l_str == '' ) return $alpha[0];
$letters = array_reverse( str_split( $l_str ) );
$carry = 1;
foreach( $letters as $k=>$v ){
if( $carry == 1 )
$letters[$k] = $alpha[(array_search($v,$alpha)+1)%count($alpha)];
if( $letters[$k] != $alpha[0] ) // new letter not an 'a'
$carry = 0;
}
return ($carry == 1 ? $alpha[0] : '').implode(array_reverse($letters));
}