#PHPで数値をアルファベットに変換する方法
先日、PHPを勉強していてchr()関数とord()関数で、はまってしまったのでまとめておきます。
##chr()関数とは
この関数は、ASCII, ISO-8859, Windows1252のようなシングルバイトエンコーディング においては、文字セットのマッピングテーブルにある望みの文字の位置を渡すことで、一文字の文字列を作り出すのに使えます。しかし、この関数は stringのエンコーディングについて知りませんし、特にUTF-8やUTF-16のようなマルチバイトエンコーディングについては、この関数にUnicodeのコードポイントは渡せないことに注意してください。
つまり、シングルバイトエンコーディングに登録されている文字セットを、ユーザによって指定されたINT型の数値によって、対応している文字列(英数字か記号のみ)を返す関数であるといえます。
###ASCII(アスキーコード)とは
コンピュータは0か1かの2進数でしか認識できません。もちろん、ユーザは文字を扱う為それではコンピュータとやりとりができません。そこで、文字をコンピュータが認識できるように文字と2進数を対応付けさせ、登録させたのがASCII、文字コードの一種で、英数字と記号であるといえます。
では、指定した数値に応じて英数字に変換する関数をつくっていきましょう。
<?php
function changeNumberToAlphabet(int $number)
{
return chr($number);
}
$number = changeNumberToAlphabet(65);
echo $number;
//結果A
//返り値を大文字英数字に指定する場合65~90(A〜Z)
echo chr(65);
echo chr(66);
echo chr(67);
//結果 A
//結果 B
//結果 C
//返り値を小文字英数字に指定する場合97~122(a~z)
echo chr(97);
echo chr(98);
echo chr(99);
//結果a
//結果b
//結果c
?>
ASCIIコードによって登録されている英数字が大文字(65~90)、小文字(97~122)が指定された数値によって参照し、変換されます。
ただ、chr(65) == Aではなく、指定した数値を任意の結果にしたい、という場合もあるでしょう。例えば、chr(1) == Aのような場合です。その場合は、以下のように指定してすることで、思うような結果になります。
<?php
function changeNumberToAlphabet(int $number)
{
return chr(ord('A') + $number - 1);
//chr(65 + $number - 1) と同義
}
changeNumberToAlphabet(1);
//結果 A
?>
上記の例で、ord('A')の部分ですが、chr()が数値を英数字に変換する関数であれば、ord()関数は、英数字を数値に変換する関数です。
##ord()関数とは
string が ASCII, ISO-8859, Windows 1252 のような シングルバイトエンコーディング だった場合、 これは文字セットのマッピングテーブルにある文字の位置を返すことと同義です。 しかし、この関数はstring のエンコーディングについて知りませんし、 特に UTF-8 や UTF-16 のようなマルチバイトエンコーディングについては、 この関数からは Unicode のコードポイントは絶対にわからないことに注意してください。
この関数は chr() と逆の動作をします。
先程は、数値を英数字に変換する関数でしたが、次は英数字を数値に変換する関数をつくっていきましょう。
<?php
function changeNumberAlphabet(string $alhabet): int
{
return ord($alhabet) - ord('A') + 1;
//$alhabet - 65 + 1 と同義
}
$number = changeNumberAlphabet('B');
echo $number;
//結果 2
?>
##まとめ
chr関数とは、ASCIIによって登録されている文字セットを、数値からアルファベットに変換する関数であること。
ord関数とは、その逆でアルファベットを数値に変換する関数であること。