テクノロジー

2023年2月2日

nullと正規表現

  • nullと正規表現について理解できる
  • 評価ポイントとコメントを受け取って表示するプログラムを作成する

nullとは

nullは、値を持たない変数を表す場合に用いる値です。nullnull型において唯一使用可能な値です。
PHPの真偽値ルールでは、nullも偽として扱われます。

例えば、データベースの中から条件に該当するデータを検索するプログラムを作成した場合や、該当するデータがなかった場合の処理を記述する時などによく使われます。

[例]

<?php
 
function search(){
    // データを検索する処理
    // 検索結果がなかった時は null が返る
}
 
if (search()) {
    // なにかしら検索結果があった時の処理
    echo 'データがありました' . PHP_EOL;
} else {
    // 検索結果がなかった時の処理
    echo 'データがありませんでした' . PHP_EOL;
}

上記の例で、searchという関数は、データを検索して検索結果を返す関数を定義していると想定します。
もし検索結果が0という数字であったり空文字以外にnullが返される場合があります。
これらの値が返された場合、偽と評価されるので echo 'データがありませんでした' . PHP_EOL; が実行されます。

変数がnullであるかどうかをチェックする関数

is_null 関数を使用すると、値自身や変数に代入されている値が null かどうかを確認することができます。
この関数は、変数が null の場合は true を、そうでない場合は false を返します。

[例]

<?php
 
$foo = null;
$bar = 0;
$buz = '';
 
var_dump (is_null($foo));
var_dump (is_null($bar));
var_dump (is_null($buz));

[実行結果]

bool(true)
bool(false)
bool(false)

変数の値が null かどうかを判定するときは、is_null 関数を使うか、is_null 関数は使わずに、if ($number === null)$numberは変数)のように直接比較する書き方もできます。

正規表現とは

正規表現は少し難しいですが、どのような時に使用され、どのようなものなのかということは理解しておきましょう。
これからPHPでプログラミングしていく中で、このようなコードを見かけるかもしれません。

<?php
 
$reg = "/[a-z0-9_]+/";

この呪文のようなコードが正規表現です。
正規表現とは、ある文字の並び(文字列)を表現する方法です。

例えば、Webサイトの入力フォームで電話番号を入力させる時、入力されたデータが電話番号として正しい数字かどうかを判断する時などに使用します。
電話番号の場合、10桁であること、0から始まることなど、一定のルールがあります。送られてきたデータがそのルールとマッチしているかどうかチェックするときに、一定のルールを表現したものが正規表現です。正規表現自体はPHP以外の言語でも使われる表現方法です。

正規表現で用いられる/をデリミタといいます。デリミタとは区切り文字のことで、正規表現を記述する場合、正規表現の部分をデリミタで囲みます。
デリミタには、文字、数字、バックスラッシュ、スペース以外の任意の記号も使用できます。
最も一般的な区切り文字はフォワードスラッシュ(/)ですが、正規表現にフォワードスラッシュが含まれている場合は、一般的に#や~などの区切り文字を使用します。

ここでは正規表現の使い方などの説明はしませんが、既存のコードで正規表現オブジェクトを見かけた時に「これは正規表現だな」と理解できるようにしておきましょう。

評価ポイントとコメントを受け取って表示するプログラムをつくってみよう

それでは、ここまで学習したことを使って、掲示板アプリケーションのバックエンドプログラムの基礎を作ってみましょう。
sample.phpの中身を削除して新しく記述していきましょう。

ここで作成するプログラムの要件を再度確認します。要件を見て、まずは自分でプログラムを考えてみてください。
このテキストの末尾に解答コードがあります。
難しい場合は、テキストを読み進めながら要件1〜6を実装していきましょう。

プログラムの要件

  1. “1から5の数字で評価を入力してください。終了する場合は「6」を入力してください”と出力する
  2. readlineで入力された評価ポイント受け取る
  3. 数字以外を入力された場合は”数字を入力してください”と出力して入力モードに移行する。6が入力された場合は”終了します”と出力してプログラムを終了する(今回入力される数字は、1から5の数字または6である想定で作成します)
  4. readlineで入力されたコメントを受け取る
  5. 評価ポイントとコメントを”あなたのポイント:○ あなたのコメント:○○○”と出力する
  6. 1に戻る
    PHPコマンドを使い、逐一実行結果を確認しながら進めてみましょう。

受け取ったポイントを数値にして条件分岐しよう

  1. “1から5の数字で評価を入力してください。終了する場合は「6」を入力してください”と出力する
    メッセージをreadline()で出力します。

  2. readlineで入力された評価ポイント受け取る
    評価ポイントを受け取るために $point 変数を用意します。
    $point 変数に readline() で入力された値を intval() で数値に変換して変数の $point に格納します。

<?php
 
$point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));

3. 数字以外を入力された場合は”数字を入力してください”と出力して入力モードに移行する。6が入力された場合は”終了します”と出力してプログラムを終了する(今回入力される数字は、1から5の数字または6である想定で作成します)

条件を整理しましょう。今回の分岐は「1から5の数字を入力した場合」、「6を入力した場合」、「数字以外を入力した場合」の3つです。
$point が1から5の数字の場合」、「$point が6の場合」、「$point が数字以外の場合」です。この三つの条件を if で条件分岐します。
三つの条件のうちどれを if の条件にし、どれを elseif の条件にするのが効率的か考えます。

if の条件は狭く、elseifif の条件からは漏れたけれども他の条件に当てはまるもの、elseはそれ以外という広い条件です。指定する条件が狭いものから ifelseif、`elseの順に設定していきましょう。

まず一番条件が狭いのが 「$pointが6の場合」 ですので、これを if の条件にします。
$point が6の場合」の処理は、「”終了します”と出力する」です。

// 省略
if ($point === 6) {
    echo '終了します' . PHP_EOL;
} elseif (.....) {
 
} else {
 
}
// 省略

次に狭いのが 「$point が1から5の数字の場合」 です。今回は数字を入力された場合は1から5、または6が必ず入力される想定で作成します。「$point が数字の場合」に置き換えても大丈夫でしょう。
数字以外が入力された文字に intval() を使うと 0 になるため、elseifpoint !== 0 という条件式をおきます。
$point が1から5の数字の場合」の処理は if のコードが完成してから記述しましょう。

// 省略
if ($point === 6) {
    echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
    // $pointが1から5の数字の場合の処理
} else {
 
}
// 省略

$point が数字以外の場合」 はそれ以外のすべてに該当しますので else に処理を記述します。
$point が数字以外の場合」の処理は「数字以外を入力された場合は”数字を入力してください”と出力して入力モードに移行する」です。
入力モードにするということは $point = readline() に戻るということなので、最終的に全体を繰り返し処理させれば実現できます。

// 省略
if ($point === 6) {
    echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
    // $pointが1から5の数字の場合の処理
} else {
    echo '数字を入力してください' . PHP_EOL;
}
// 省略

現時点でのコードは以下の通りです。

<?php
 
$point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));
 
if ($point === 6) {
    echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
    // $pointが1から5の数字の場合の処理
} else {
    echo '数字を入力してください' . PHP_EOL;
}

コメントを受け取って、ポイントとコメントを表示しよう

$point が1から5の数字の場合」、「$point が6の場合」、「$point が数字以外の場合」のうち、「$point が1から5の数字の場合」だけコメントを受け取って、ポイントとコメントを表示する処理が入ります。
コードの elseif ($point !== 0) の中の処理を作っていきましょう。

<?php
 
$point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));
 
if ($point === 6) {
    echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
    // この部分の処理を作る
} else {
    echo '数字を入力してください' . PHP_EOL;
}
  1. readline で入力されたコメントを受け取る

コメントを受け取るために $comment を用意し、readline で入力された値を格納します。

$comment = readline('コメントを入力してください' . PHP_EOL);

5. 評価ポイントとコメントを”あなたのポイント:○ あなたのコメント:○○○”と出力する

評価ポイントとコメントを表示するため、それぞれの変数を式展開して echo で出力させます。

$comment = readline('コメントを入力してください' . PHP_EOL);
echo "あなたのポイント: $point" . PHP_EOL;
echo "あなたのコメント: $comment" . PHP_EOL;

これで「$point が1から5の数字の場合」の処理が完成です。elseif の中に入れましょう。

<?php
 
echo '1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL;
$point = intval(readline());
 
if ($point === 6) {
    echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
    $comment = readline('コメントを入力してください' . PHP_EOL);
    echo "あなたのポイント: $point" . PHP_EOL;
    echo "あなたのコメント: $comment" . PHP_EOL;
} else {
    echo '数字を入力してください' . PHP_EOL;
}

whilebreak で繰り返しを実装しよう

6. 1に戻る

1に戻るため、繰り返し処理を追加します。
繰り返し処理は while を使い、これまでに作成したコードを追加します。
$point が6の場合」以外は処理を繰り返したいので、「$point が6の場合」のみ break で処理を抜け、それ以外の場合は特に条件なく繰り返し処理をします。
while の条件を true としておけば常に真のため、条件なく繰り返し処理をさせることができます。

<?php
 
while (true) {
    // これまでのコードを追加し、「pointが6の場合」のみbreakで処理を抜ける
}

while の処理を記述し、プログラムが完成しました。

解答コード

[sample.php]

<?php
 
while (true) {
    $point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));
 
    if ($point === 6) {
        echo '終了します' . PHP_EOL;
        break;
    } elseif ($point !== 0) {
        $comment = readline('コメントを入力してください' . PHP_EOL);
        echo "あなたのポイント: $point" . PHP_EOL;
        echo "あなたのコメント: $comment" . PHP_EOL;
    } else {
        echo '数字を入力してください' . PHP_EOL;
    }
}

まとめ

- nullは、値が存在しないことを表すnull型の唯一の値である。
- 正規表現は、データが特定のルールにマッチするかどうかなどをチェックするために使用され、デリミタで囲むことで正規表現と認識される。

公式ドキュメント・参考情報

ダイビックのことをもっと知ってみませんか?