0

ユーザーが特定のIDを入力できるようにするためのユーザーフレンドリーなシステムを作成したいと思います。

id 1-26: A-Z
27: AA
28: AB
    ...
    ...
    ZZZ

これを達成するためにいくつかの方法を試しましたが、ランダムな文字が表示されます...

$counter = 7;
do {
    $temp = floor($id / (26^$counter)) % 26; 
    $counter--;
    echo($temp.' ');
} while($counter > 0);
4

2 に答える 2

1

Excelの列名を番号順にマッピングするのは0、AZにはないので、ちょっとくだらないことです...

とにかく、私はそれらを前後に変換するための2つの関数を思いついた:

function calcCol($col) //character to number
{
    if(is_numeric($col)) return intval($col);
    $col=array_reverse(str_split(strtoupper(preg_replace("/[^a-z]/i","",$col))));
    $num=0;
    foreach($col as $i=>$ch)
    {
        $num+=(ord($ch)-ord('A')+1)*pow(27,$i);
    }
    $num-=ceil($num/27)-1;
    return $num;
}
function getCol($col) //number to character
{
    if(preg_match("/^[a-z]+$/i",$col)) return strtoupper($col);
    $col=abs(intval($col));
    $col+=ceil($col/26)-1;
    $str="";
    while($col>0)
    {
        $tmp=$col%27;
        $str=chr($tmp-1+ord('A')).$str;
        $col=floor($col/27);
    }
    return $str;
}

説明:

AZを、欠落/非表示の27ベースの0記数法と見なします。

そして、文字から数字に変換した後、027が「カウント」された数を数えることによってそれらの隠されたsを削除します(ceil($num/27));

そして、数字から文字に変換する前に、0「カウント」された26の数を数えて、それらの非表示のsを追加し直します(ceil($col/26))。

于 2012-09-17T08:31:38.863 に答える
0

これはベース変換の問題ですが、少しトリックがあります。

最初に、と見なす'A'1'AA'または'AAA'意味をなす可能性があり、 ..と'B'見なしますが、どうでしょうか。いいえ、26ではありません。ここでの秘訣は、をと見なすことです。変換時にを見つけるたびに、それをと書き留めて、 (1を引くことによって)捨てます。2'C'3'Z''Z''Z''A0'0'Z''A'

したがって、次のコードがあります。

function num2user( $num )
{
    $s = "ZABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $ret = "";
    while( $num > 0 )
    {
        $m = $num % 26;
        $ret = $s[$m].$ret;
        $num = floor($num / 26);
        if( $m == 0 ) $num = $num - 1;
    }
    return $ret;
}

for( $i = 1 ; $i < 128 ; $i++ )
{
    echo "$i=".num2user($i)."\n";
}
于 2012-09-17T09:03:19.183 に答える