我要讓這樣的前一個函數:如何在PHP中使用字符串創建「數字」?
下一個(「ABC」)返回「ACA」 - 這是下一個字符串,3個單位
這就象我們有一個數字從0到9,該函數返回下一個數
NEXT2(135)返回136 - 這是具有3位數字
我們使用號碼的基-10系統中的我想使用numbersletters的下一個數字,這意味着基體-36系統,並得到下一個所謂號碼
非常感謝!
我要讓這樣的前一個函數:如何在PHP中使用字符串創建「數字」?
下一個(「ABC」)返回「ACA」 - 這是下一個字符串,3個單位
這就象我們有一個數字從0到9,該函數返回下一個數
NEXT2(135)返回136 - 這是具有3位數字
我們使用號碼的基-10系統中的我想使用numbersletters的下一個數字,這意味着基體-36系統,並得到下一個所謂號碼
非常感謝!
下面是在你的base3字母數字系統產生的下一個值的函數:
function nextval($input, $pad = 1) {
$map = array(0 => 'A', 1 => 'B', 2 => 'C');
//convert letters to numbers
$num = '';
for ($i = 0; $i < strlen($input); $i++) {
$num .= array_search($input{$i}, $map);
}
//convert the number to base 10, then add 1 to it
$base10 = base_convert($num, 3, 10);
$base10++;
//convert back to base 3
$base3 = base_convert($base10, 10, 3);
//swap the digits back to letters
$num = '';
for ($i = 0; $i < strlen($base3); $i++) {
$num .= $map[$base3{$i}];
}
//pad with leading A's
while (strlen($num) < $pad) {
$num = 'A' . $num;
}
return $num;
}
echo nextval('ABC', 3); //ACA
注意,結果是「CA」爲「ACA」是就像在base-10中編寫「06」一樣...我們通常不會寫前導零,所以你不會寫前面的「A」。
因此,我添加了一個填充參數,可讓您指定要填充的位數。與$pad=3
,你會從「ABC」下一個「ACA」。
我現在想到的一種方法是將字符轉換爲base26,然後將數字加1並將其轉換回來,我希望你明白。 Next2應該做一個相同的,但與base10這是默認,所以我只是一個數字本身+1。 期待看到其中的其他實現。
編輯:沒有注意到你有A在最後。愚蠢的我這樣做。這將是base3然後,而不是26
像這樣的事情
<?php
function toNext($input) {
$conv = strtr(strtolower($input), array(
'a' => '0',
'b' => '1',
'c' => '2'));
$conv = base_convert($conv, 3, 10);
$conv++;
$output = base_convert($conv, 10, 3);
$output = sprintf("%03d", $output);
$output = strtr((string) $output, array(
'0' => 'a',
'1' => 'b',
'2' => 'c'));
return strtoupper($output);
}
var_dump(toNext('ABC'));
var_dump(toNext('ABA'));
這些手動基本轉換功能不從內置者的不準確性受到影響。
<?php
function next($str)
{
$baseDec = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
$baseAln = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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');
return base_conv((string) ((int) base_conv($str, $baseAln, $baseDec) + 1), $baseDec, $baseAln);
}
function base_conv_str($valStr, $baseToStr, $baseFromStr)
{
$baseTo = str_split($baseToStr);
$baseFrom = str_split($baseFromStr);
return base_arr_to_str(base_conv_arr(base_str_to_arr((string) $valStr, $baseFrom), count($baseTo), count($baseFrom)), $baseTo);
}
function base_conv($valStr, &$baseTo, &$baseFrom)
{
return base_arr_to_str(base_conv_arr(base_str_to_arr((string) $valStr, $baseFrom), count($baseTo), count($baseFrom)), $baseTo);
}
function base_conv_arr($val, $baseToDigits, $baseFromDigits)
{
$valDigits = count($val);
$result = array();
do
{
$divide = 0;
$newlen = 0;
for ($i = 0; $i < $valDigits; ++$i)
{
$divide = $divide * $baseFromDigits + $val[$i];
if ($divide >= $baseToDigits)
{
$val[$newlen ++] = (int) ($divide/$baseToDigits);
$divide = $divide % $baseToDigits;
}
else if ($newlen > 0)
{
$val[$newlen ++] = 0;
}
}
$valDigits = $newlen;
array_unshift($result, $divide);
}
while ($newlen != 0);
return $result;
}
function base_arr_to_str($arr, &$base)
{
$str = '';
foreach ($arr as $digit)
{
$str .= $base[$digit];
}
return $str;
}
function base_str_to_arr($str, &$base)
{
$arr = array();
while ($str === '0' || !empty($str))
{
foreach ($base as $index => $digit)
{
if (mb_substr($str, 0, $digitLen = mb_strlen($digit)) === $digit)
{
$arr[] = $index;
$str = mb_substr($str, $digitLen);
continue 2;
}
}
throw new Exception();
}
return $arr;
}
?>
根據澤維爾 - 巴博薩的回答您的意見,如果你想使用所有的字母from a to z
,你可以這樣做:
$str = 'ajz';
echo ++$str,"\n";
會打印:aka
要獲得在未來數base36使用:
function next_base36($n) {
$n = base_convert($n, 36, 10);
return base_convert($n + 1, 10, 36);
}
爲什麼`ABC`在`ACA`旁邊?我不明白。你能詳細說明你想使用的系統嗎? – 2011-02-05 09:15:02
這是使用A B C而不是0 1 2作爲數字的base-3數字系統。 – 2011-02-05 09:16:05
@丹啊,當然了(我讀的是ABA,現在是清晨)。謝謝 – 2011-02-05 09:16:46