2016/10/18 20:20:35

PHPのrange関数で数字やアルファベットを生成する

php-logo
目次(クリックするとジャンプします)
  • 1:任意の数列が欲しい
  • 2:range関数の使い方
  • 2.1:数字の出力
  • 2.2:実は文字列も生成できる
  • 2.3:記号の出力もできる
  • 2.4:出力はASCIIコードに従っている
  • 3:補足・ハマったポイント
  • 3.1:少数は出力できない
  • 3.2:日本語も出力できません
  • 4:まとめ

任意の数列が欲しい

人は悲しくなると任意の数列や文字列が欲しくなる時ってありますよね。

PHPではそんな時に便利なrange関数が用意されています。

PHPマニュアルではこんな説明があります。

range — ある範囲の整数を有する配列を作成する

range関数の使い方

数字の出力

こんな感じで使います。

$a = range(1, 10);

$aには以下のような添字配列が格納されます。

array(10) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
}

指定どおり1から10までの数字が生成されていますね。

実は文字列も生成できる

先ほどのPHPマニュアルの説明を見ると「ある範囲の整数を有する配列を作成する」とあるので数字だけしか生成できないと思えるのですが、じつはrange関数はアルファベットも生成できます。

$a = range('a', 'z');

$aには以下のような添字配列が格納されます。

array(26) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "f"
  [6]=>
  string(1) "g"
  [7]=>
  string(1) "h"
  [8]=>
  string(1) "i"
  [9]=>
  string(1) "j"
  [10]=>
  string(1) "k"
  [11]=>
  string(1) "l"
  [12]=>
  string(1) "m"
  [13]=>
  string(1) "n"
  [14]=>
  string(1) "o"
  [15]=>
  string(1) "p"
  [16]=>
  string(1) "q"
  [17]=>
  string(1) "r"
  [18]=>
  string(1) "s"
  [19]=>
  string(1) "t"
  [20]=>
  string(1) "u"
  [21]=>
  string(1) "v"
  [22]=>
  string(1) "w"
  [23]=>
  string(1) "x"
  [24]=>
  string(1) "y"
  [25]=>
  string(1) "z"
}

ちゃんとアルファベットが出力されていますね!

もちろん大文字でも出力できますよ。

$a = range('A', 'Z');

これは以下のようになります。

array(26) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
  [5]=>
  string(1) "F"
  [6]=>
  string(1) "G"
  [7]=>
  string(1) "H"
  [8]=>
  string(1) "I"
  [9]=>
  string(1) "J"
  [10]=>
  string(1) "K"
  [11]=>
  string(1) "L"
  [12]=>
  string(1) "M"
  [13]=>
  string(1) "N"
  [14]=>
  string(1) "O"
  [15]=>
  string(1) "P"
  [16]=>
  string(1) "Q"
  [17]=>
  string(1) "R"
  [18]=>
  string(1) "S"
  [19]=>
  string(1) "T"
  [20]=>
  string(1) "U"
  [21]=>
  string(1) "V"
  [22]=>
  string(1) "W"
  [23]=>
  string(1) "X"
  [24]=>
  string(1) "Y"
  [25]=>
  string(1) "Z"
}

記号の出力もできる

実はさらに数字とアルファベット以外に記号も出力できます。

$a = range('!', '/');

これはこう出力されます。

array(15) {
  [0]=>
  string(1) "!"
  [1]=>
  string(1) """
  [2]=>
  string(1) "#"
  [3]=>
  string(1) "$"
  [4]=>
  string(1) "%"
  [5]=>
  string(1) "&"
  [6]=>
  string(1) "'"
  [7]=>
  string(1) "("
  [8]=>
  string(1) ")"
  [9]=>
  string(1) "*"
  [10]=>
  string(1) "+"
  [11]=>
  string(1) ","
  [12]=>
  string(1) "-"
  [13]=>
  string(1) "."
  [14]=>
  string(1) "/"
}

おお!!記号がずらり!

出力はASCIIコードに従っている

もうお気づきの方も居られると思いますが、range関数はASCIIコードに従った文字の出力を行ってくれます。

ASCIIコードの制御文字を除いた表です。range関数はstring型で引数を与えた場合この順番で文字を出力してくれます。

順番 コード 文字
33 0x21 !
34 0x22
35 0x23 #
36 0x24 $
37 0x25 %
38 0x26 &
39 0x27
40 0x28 (
41 0x29 )
42 0x2a *
43 0x2b +
44 0x2c ,
45 0x2d
46 0x2e .
47 0x2f /
48 0x30 0
49 0x31 1
50 0x32 2
51 0x33 3
52 0x34 4
53 0x35 5
54 0x36 6
55 0x37 7
56 0x38 8
57 0x39 9
58 0x3a :
59 0x3b ;
60 0x3c <
61 0x3d =
62 0x3e >
63 0x3f ?
64 0x40 @
65 0x41 A
66 0x42 B
67 0x43 C
68 0x44 D
69 0x45 E
70 0x46 F
71 0x47 G
72 0x48 H
73 0x49 I
74 0x4a J
75 0x4b K
76 0x4c L
77 0x4d M
78 0x4e N
79 0x4f O
80 0x50 P
81 0x51 Q
82 0x52 R
83 0x53 S
84 0x54 T
85 0x55 U
86 0x56 V
87 0x57 W
88 0x58 X
89 0x59 Y
90 0x5a Z
91 0x5b [
92 0x5c \
93 0x5d ]
94 0x5e ^
95 0x5f _
96 0x60 `
97 0x61 a
98 0x62 b
99 0x63 c
100 0x64 d
101 0x65 e
102 0x66 f
103 0x67 g
104 0x68 h
105 0x69 i
106 0x6a j
107 0x6b k
108 0x6c l
109 0x6d m
110 0x6e n
111 0x6f o
112 0x70 p
113 0x71 q
114 0x72 r
115 0x73 s
116 0x74 t
117 0x75 u
118 0x76 v
119 0x77 w
120 0x78 x
121 0x79 y
122 0x7a z
123 0x7b {
124 0x7c |
125 0x7d }
126 0x7e ~

つまり数字とアルファベット(大文字・小文字)と記号を全部出力したいなら、

$a = range('!', '~');

とすると全部の文字が対象になりますので以下のように出力されマス。

array(94) {
  [0]=>
  string(1) "!"
  [1]=>
  string(1) """
  [2]=>
  string(1) "#"
  [3]=>
  string(1) "$"
  [4]=>
  string(1) "%"
  [5]=>
  string(1) "&"
  [6]=>
  string(1) "'"
  [7]=>
  string(1) "("
  [8]=>
  string(1) ")"
  [9]=>
  string(1) "*"
  [10]=>
  string(1) "+"
  [11]=>
  string(1) ","
  [12]=>
  string(1) "-"
  [13]=>
  string(1) "."
  [14]=>
  string(1) "/"
  [15]=>
  string(1) "0"
  [16]=>
  string(1) "1"
  [17]=>
  string(1) "2"
  [18]=>
  string(1) "3"
  [19]=>
  string(1) "4"
  [20]=>
  string(1) "5"
  [21]=>
  string(1) "6"
  [22]=>
  string(1) "7"
  [23]=>
  string(1) "8"
  [24]=>
  string(1) "9"
  [25]=>
  string(1) ":"
  [26]=>
  string(1) ";"
  [27]=>
  string(1) "<"
  [28]=>
  string(1) "="
  [29]=>
  string(1) ">"
  [30]=>
  string(1) "?"
  [31]=>
  string(1) "@"
  [32]=>
  string(1) "A"
  [33]=>
  string(1) "B"
  [34]=>
  string(1) "C"
  [35]=>
  string(1) "D"
  [36]=>
  string(1) "E"
  [37]=>
  string(1) "F"
  [38]=>
  string(1) "G"
  [39]=>
  string(1) "H"
  [40]=>
  string(1) "I"
  [41]=>
  string(1) "J"
  [42]=>
  string(1) "K"
  [43]=>
  string(1) "L"
  [44]=>
  string(1) "M"
  [45]=>
  string(1) "N"
  [46]=>
  string(1) "O"
  [47]=>
  string(1) "P"
  [48]=>
  string(1) "Q"
  [49]=>
  string(1) "R"
  [50]=>
  string(1) "S"
  [51]=>
  string(1) "T"
  [52]=>
  string(1) "U"
  [53]=>
  string(1) "V"
  [54]=>
  string(1) "W"
  [55]=>
  string(1) "X"
  [56]=>
  string(1) "Y"
  [57]=>
  string(1) "Z"
  [58]=>
  string(1) "["
  [59]=>
  string(1) "\"
  [60]=>
  string(1) "]"
  [61]=>
  string(1) "^"
  [62]=>
  string(1) "_"
  [63]=>
  string(1) "`"
  [64]=>
  string(1) "a"
  [65]=>
  string(1) "b"
  [66]=>
  string(1) "c"
  [67]=>
  string(1) "d"
  [68]=>
  string(1) "e"
  [69]=>
  string(1) "f"
  [70]=>
  string(1) "g"
  [71]=>
  string(1) "h"
  [72]=>
  string(1) "i"
  [73]=>
  string(1) "j"
  [74]=>
  string(1) "k"
  [75]=>
  string(1) "l"
  [76]=>
  string(1) "m"
  [77]=>
  string(1) "n"
  [78]=>
  string(1) "o"
  [79]=>
  string(1) "p"
  [80]=>
  string(1) "q"
  [81]=>
  string(1) "r"
  [82]=>
  string(1) "s"
  [83]=>
  string(1) "t"
  [84]=>
  string(1) "u"
  [85]=>
  string(1) "v"
  [86]=>
  string(1) "w"
  [87]=>
  string(1) "x"
  [88]=>
  string(1) "y"
  [89]=>
  string(1) "z"
  [90]=>
  string(1) "{"
  [91]=>
  string(1) "|"
  [92]=>
  string(1) "}"
  [93]=>
  string(1) "~"
}

この場合は数字はstring型になりますのでご注意を。

補足・ハマったポイント

少数は出力できない

float型を与えてもエラーが出ます。少数の出力はできません。

この場合は…

$a = range(0.01, 0.05);                                                                                                                    
var_dump($a);

こうなります。

Warning: range(): step exceeds the specified range in /hoge/range.php on line 2
bool(false)

数値はint型のみが有効です。

日本語も出力できません

当たり前かもしれませんが日本語も出力できませんでした。やっぱり範囲はASCIIコードに限るようです。

$a = range('あ', 'ん');¬                                                                                                                           
var_dump($a);

ただしこの場合はエラーではなく空配列が返されます。

array(1) {
  [0]=>
  string(1) "
}

まとめ

こういった出力ができるのであればワンタイムパスワードやnonceなどの生成も強固にできるかもしれませんね。

PHPではジェネレータがあり、こういう文字列や数列の生成はジェネレータを使ったほうが良いのかもしれませんが、renge関数も小回りの効く便利な関数です。意外と使いドコロはありそうです。

  • range関数は数字や文字列を配列で出力してくれる
  • 文字列の出力も可能
  • 文字列の出力の場合ASCIIコードの順序にしたがって出力される」
  • そのため記号の出力もできる