0

以前の ID を 1 増やして新しい ID を自動的に生成する php スクリプトを作成したいと思います。例: A0009 は A0010 になり、A9999 は B0000 になります。

動作するものを書きましたが、5 文字を超えません: 例: Z9999 は A00000 に移動する必要があります。

助言がありますか?ここに私のスニペットがあります:

<?php
function replaceChar($string2replace)
{
$charLength = strlen($string2replace)-1;
$charAt = array();
$charAt[4] = substr($string2replace, -1);
$charAt[3] = substr($string2replace, -2,1);
$charAt[2] = substr($string2replace, -3,1);
$charAt[1] = substr($string2replace, -4,1);
$charAt[0] = substr($string2replace, 0,1);

if($charAt[4] < 9)
{
$string2replace = substr_replace($string2replace,$charAt[4]+1,$charLength);
}
else
{
$charAt[4] = 0;
$string2replace = substr_replace($string2replace,$charAt[4],$charLength);
    if($charAt[3] < 9)
{
$string2replace = substr_replace($string2replace,$charAt[3]+1,$charLength- 1,1);
}
else
{
$charAt[3] = 0;
$string2replace = substr_replace($string2replace,$charAt[3],$charLength-1,1);

if($charAt[2] < 9)
{
$string2replace =  substr_replace($string2replace,$charAt[2]+1,$charLength-2,1);
}
else
{
$charAt[2] = 0;
$string2replace = substr_replace($string2replace,$charAt[2],$charLength-2,1);

if($charAt[1] < 9)
{
$string2replace = substr_replace($string2replace,$charAt[1]+1,$charLength-3,1);
}
else
{
$charAt[1] = 0;
    $string2replace =    substr_replace($string2replace,$charAt[1],$charLength-3,1);
    }

if($charAt[0] < 'z')
{
$charAt[0] ++;
$string2replace =    substr_replace($string2replace,$charAt[0],$charLength-4,1);
}
else
{
$charAt[0] = 'a';
$string2replace =  substr_replace($string2replace,$charAt[0],$charLength-4,1);
}
}   
}
}
return $string2replace;
}

$string2begin = 'A9999';

$generatedString = replaceChar($string2begin);

echo $string2begin . "<br />" . $generatedString;


?>
4

1 に答える 1

3

あなたのID番号付けスキームは、上位の数字がA-Zで、残りの数字が0-9. そのパターンを正しく理解していれば、これでうまくいくようです:

function incrementID($id)
{
    $letter = $id[0];
    $number = substr($id, 1);

    $newNum = str_pad($number + 1, strlen($number), '0', STR_PAD_LEFT);

    // increase number only
    if (strlen($number) == strlen($newNum))
        return $letter . $newNum;

    // increase ID length ('Z' to 'A')
    if ($letter == 'Z')
        return 'A' . str_repeat('0', strlen($number) + 1);

    // change letter
    $newLetter = chr(ord($letter) + 1);
    return $newLetter . str_repeat('0', strlen($number));

}

printf("%s\n", incrementID('A0009')); // 'A0010'
printf("%s\n", incrementID('A9999')); // 'B0000'
printf("%s\n", incrementID('Z9999')); // 'A00000'

あなたの例はこれに適合しませんでしたが、私は最初にあなたが本当にベース36の数字を望んでいると仮定しました(任意0-9,A-ZA数字Zbase_convert()を使用して通常の base-10 に変換できるため、base-36 の数値を扱うのは簡単です。基数 36 の数値をインクリメントするために必要なことは次のとおりです。

function incrementBase36($id)
{
    $numVal = base_convert($id, 36, 10);
    $newId = base_convert($numVal + 1, 10, 36);
    return strtoupper($newId);
}

printf("%s\n", incrementBase36('A0009')); // 'A000A'
printf("%s\n", incrementBase36('A9999')); // 'A999A'
printf("%s\n", incrementBase36('Z9999')); // 'Z999A'
printf("%s\n", incrementBase36('AZZZZ')); // 'B0000'
printf("%s\n", incrementBase36('ZZZZZ')); // '100000'
于 2012-06-19T18:59:40.740 に答える