第8章 文字列
8.1 文字列の比較をする
実践的なWebアプリケーションを作成するにあたって、入力しているデータに誤りがないかどうかをチェックする機能は重要になります。誤ったデータのまま処理を進めると、予期せぬエラーや処理が実行されてしまい、データの損失や処理の不整合につながりかねません。安全で確実な処理を組み立てて動かすにあたって、データの入力チェックは欠かせない処理となっています。
そこで本章では、入力フォームを使ってデータの受け渡しをするPHPで入力チェック機能を作成する時によく使う文字列を扱う組み込み関数について学習します。
まず、文字列の比較を行うstrcmp()関数について紹介します。
8.1.1 strcmp()関数
strcmp()関数は、2つの文字列を引数として渡して比較した結果を返す関数です。
凡例:strcmp()関数の呼び出し方
比較結果の戻り値は以下のようになります。
・文字列1と文字列2が大文字小文字も含めて一致するとき、0
・文字列1と文字列2が異なるとき、その異なった文字であるn文字目のバイト列の差
(文字列1のn文字目のバイト列-文字列2のn文字目のバイト列 の計算結果)
2つの文字列が一致する時は0というシンプルな戻り値ですが、異なる時の戻り値についてはちょっと複雑そうに見えます。実際に使う時は戻りが0かどうかだけを判断することが多いので、異なった時にどんな数値になるかはあまり意識しなくても良いのですが、次のサンプルコードで戻り値がどうなるか、解説していきます。
8.1.2 strcmp()関数を使ったプログラム
渡した文字列によってstrcmp()関数の戻り値がどうなるかを確認するプログラムです。
ソースコード
ソース・フォルダー :myproj_framework_basic/ch08
ファイル名 :strcmp.php
アクセスURL :http://localhost/myproj_framework_basic/ch08/strlen.php
➢ strcmp.php
<?php // 比較したい文字列を用意 $strArray1 = array("ruler", "pen", "pencil", "テスト", "Eraser", "eraser"); $strArray2 = array( "rubber", "ruler", "pen","テスト結果", "eraser", "eraser"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>strcmp()関数を使う</title> </head> <body> <table> <tr> <th>文字列1</th> <th>文字列2</th> <th>比較結果</th> </tr> <?php for($i = 0; $i < count($strArray1); $i++){ // 同じインデックス番号の文字列を比較する echo "<tr>"; echo"<td>" . $strArray1[$i] . "</td>"; echo"<td>" . $strArray2[$i] . "</td>"; echo"<td>" . strcmp($strArray1[$i], $strArray2[$i]) . "</td>"; echo "</tr>"; } ?> </table> </body> </html>
実行結果
解説
このstrcmp.phpは、3~4行目で用意した2つの配列を使い、同じインデックス番号に格納されている文字列をstrcmp()関数を使って比較しています。
今回、文字列は6個ずつ用意されていました。それぞれの文字列の比較結果について、解説していきます。
まず1個目の「ruler」と「rubber」は、3文字目で違う文字が登場します。「ruler」の3文字目(l)と「rubber」の3文字目(b)であれば、lの方が後ろの文字でバイト列が大きいので、文字列1>文字列2となり、戻り値は正の数である1になります。
2個目の「pen」と「ruler」は、1文字目でもう違う文字が登場しています。「pen」の1文字目(p)と「ruler」の1文字目(r)であれば、rの方が後ろの文字でバイト列が大きいので、文字列1<文字列2となり、戻り値は負の数である-1になります。
この1個目、2個目の比較でポイントになるのは、一致しなかったn文字目の文字列の大小がstrcmp()関数の戻り値なので、どちらの文字列が長いかどうかは戻り値の正負に関係しない、という点です。1個目のruler(5文字)とrubber(6文字)、2個目のpen(3文字)とruler(5文字)では、どちらも前者の方が文字列の長さは小さいですが、比較結果の戻り値は1個目は正の数、2個目は負の数です。
続いて3個目の「pencil」と「pen」は、最初の3文字までは一致していますが、4文字目で後者の文字列が終わってしまいます。そのため、「pencil」の4文字目(c)と空文字を比較することになるので、文字列1>文字列2となり、戻り値は正の数である3になります。今回はUTF-8で半角文字を表示する時のバイト列の大きさである3がそのまま戻り値の大きさになっています。
同様に4個目の「テスト」と「テスト結果」も比較の途中で前者の文字列が終わるため、空文字と「テスト結果」の4文字目(結)を比較します。その結果、文字列1<文字列2となり、戻り値は負の数である-6になります。全角文字なのでバイト列の大きさ(絶対値)も2倍になっています。
この3個目、4個目の比較でポイントになるのは、途中までは一致していてもどちらかの文字列が短い場合は、文字列のバイト列の大きさ(半角文字なら3、全角文字なら6)が戻り値になります。また、文字列2の方が短い場合は正の数、文字列1の方が短い場合は負の数になります。
残る5個目と6個目では、同じアルファベットでも大文字小文字が一致していないと比較結果が0にならないことを確認しています。大文字の方が前、小文字が後ろの文字なので、バイト列の大きさは大文字の方が小さいです。
ポイント・strcmp()関数は2つの文字列が一致しているかどうかを調べることができる。
・一致している時の戻り値は0、そうでない時はバイト列に応じて正の数か負の数が戻ってくる。
入力チェックではよく使われる関数なので、今のうちにポイントをしっかり押さえておきましょう。