正規表現とは、検索パターンを形成する文字のシーケンスです。テキスト内でデータを検索する際に、この検索パターンを使用して検索対象を記述します。
正規表現は単一の文字である場合も、より複雑なパターンである場合もあります。
正規表現は、あらゆる種類のテキスト検索およびテキスト置換操作に使用することができます。
PHPでは、正規表現はデリミタ、パターン、オプションの修飾子からなる文字列です。
$exp = "/codelabsJP/i";
上記の例では、/がデリミタであり、codelabsJPが検索されるパターンで、iは検索を大文字小文字を区別しないようにする修飾子です。
デリミタは、文字、数字、バックスラッシュ、スペース以外の任意の文字である必要があります。最も一般的なデリミタはスラッシュ(/)ですが、パターンにスラッシュが含まれる場合は#や~などの他のデリミタを選ぶと便利です。
PHPには、さまざまな正規表現を使用する関数が用意されています。
最も一般的な関数は以下の通りです:
関数 | 説明 |
---|---|
preg_match() | 文字列内でパターンが見つかれば1を返し、見つからなければ0を返す |
preg_match_all() | 文字列内でパターンが見つかった回数を返す。見つからなければ0を返すこともある |
preg_replace() | 文字列内のパターンに一致するすべての部分を別の文字列で置換した新しい文字列を返す |
preg_match()関数は、文字列にパターンが一致するかどうかを調べます。
大文字小文字を区別せずに文字列内で「codelabsJP」を検索する正規表現の使用例:
$str = "Visit codelabsJP";
$pattern = "/codelabsJP/i";
echo preg_match($pattern, $str);
preg_match_all()関数は、文字列内でパターンが見つかった回数を数えます。
大文字小文字を区別せずに文字列内で「ain」の出現回数をカウントする正規表現の使用例:
$str = "The rain in SPAIN falls mainly on the plains.";
$pattern = "/ain/i";
echo preg_match_all($pattern, $str);
preg_replace()関数は、文字列内のパターンに一致するすべての部分を別の文字列で置換します。
大文字小文字を区別せずに「Microsoft」を「codelabsJP」に置換する正規表現の使用例:
$str = "Visit Microsoft!";
$pattern = "/microsoft/i";
echo preg_replace($pattern, "codelabsJP", $str);
修飾子は検索方法を変更することができます。
修飾子 | 説明 |
---|---|
i | 大文字小文字を区別せずに検索を実行します |
m | 複数行検索を行います(パターンが文字列の先頭または末尾にマッチする場合、各行の先頭または末尾にマッチします) |
u | UTF-8エンコードされたパターンの正しいマッチングを有効にします |
角かっこは文字の範囲を見つけるために使用されます:
式 | 説明 |
---|---|
[abc] | 角かっこ内の文字のいずれかを見つけます |
[^abc] | 角かっこ内の文字以外の任意の文字を見つけます |
[a-z] | 2つの文字の間のアルファベット文字を見つけます |
[A-z] | 指定された大文字の間のアルファベット文字を見つけます |
[A-Z] | 2つの大文字の間のアルファベット文字を見つけます |
[123] | 角かっこ内の数字のいずれかを見つけます |
[0-5] | 2つの数値の間の数字を見つけます |
[0-9] | すべての数字を見つけます |
メタ文字は特別な意味を持つ文字です:
メタ文字 | 説明 |
---|---|
| | cat|dog|fishのように|で区切られたパターンのいずれかに一致します |
. | 任意の1文字に一致します |
^ | 文字列の先頭に一致します (^Hello) |
$ | 文字列の末尾に一致します (World$) |
\d | 任意の数字に一致します |
\D | 数字以外の任意の文字に一致します |
\s | 任意の空白文字に一致します |
\S | 空白文字以外の任意の文字に一致します |
\w | アルファベット(a〜Z)および数字(0〜9)に一致します |
\W | アルファベットおよび数字以外の文字に一致します |
\b | \bWORDのように単語の先頭に、またはWORD\bのように単語の末尾に一致します |
\uxxxx | 16進数xxxxで指定されたUnicode文字に一致します |
量指定子は数量を定義します:
量指定子 | 説明 |
---|---|
n+ | 少なくとも1つのnを含む任意の文字列に一致します |
n* | nの出現回数が0回以上の任意の文字列に一致します |
n? | nの出現回数が0回または1回の任意の文字列に一致します |
n{3} | 3つのnの連続に一致する任意の文字列に一致します |
n{2,5} | 2回以上5回以下のnの連続に一致する任意の文字列に一致します |
n{3,} | 3回以上のnの連続に一致する任意の文字列に一致します |
注意: 正規表現で特殊文字を検索する場合は、バックスラッシュ(\)を使用してエスケープする必要があります。たとえば、1つ以上の疑問符を検索するには、次のように表現します: $pattern = ‘/\?+/’;
パターン全体に量指定子を適用するために括弧()を使用することができます。また、パターンの一部をマッチさせるためにも使用できます。
baの後にnaが2回続く「banana」を検索するためにグループ化を使用する例:
$str = "Apples and bananas.";
$pattern = "/ba(na){2}/i";
echo preg_match($pattern, $str);
PHPの$_GETは、HTTP GETメソッドを介して受信した変数の配列を含んでいます。
HTTP GETメソッドを使用して変数を送信する主な方法は2つあります:
クエリ文字列は、URLの末尾に追加されるデータです。以下のリンクでは、?以降がクエリ文字列の一部です:
<a href="demo_phpfile.php?subject=PHP&web=コードラボJP">Test $GET</a>
上記のクエリ文字列には、以下の2つのキー/値ペアが含まれています:
PHPファイルでは、$_GET変数を使用してクエリ文字列の値を収集できます。
PHPファイル demo_phpfile.php:
<html>
<body>
<?php
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>
</body>
</html>
HTMLフォームは、フォームのmethod属性が「GET」に設定されている場合にHTTP GETメソッドを使用して情報を送信します。
これを示すために、まず簡単なHTMLフォームを作成します:
<html>
<body>
<form action="welcome_get.php" method="GET">
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
<input type="submit">
</form>
</body>
</html>
ユーザーが送信ボタンをクリックすると、フォームデータは<form>タグのaction属性で指定されたPHPファイルに送信されます。
フォームフィールドは、入力された内容とともに、クエリ文字列としてPHPファイルに送信されます:
welcome_get.php?name=John&email=john@example.com
アクションファイルでは、$_GET変数を使用して入力フィールドの値を収集できます。
welcome_get.phpページ内のPHPコード:
<html>
<body>
Welcome <?php echo $_GET["name"]; ?><br>
Your email address is: <?php echo $_GET["email"]; ?>
</body>
</html>
PHPフォームの処理時にはセキュリティに注意しましょう。
上記の例にはフォームの認証(バリデーション)などの処理はせずに、フォームデータを送信して取得する方法を示しています。
フォームデータの適切なバリデーションは、フォームをハッカーやスパムから保護するために重要です!
PHPの$_POSTは、HTTP POSTメソッドを介して受信した変数の配列を含んでいます。
HTTP POSTメソッドを使用して変数を送信する主な方法は2つあります:
HTMLフォームは、フォームのmethod属性が「POST」に設定されている場合にHTTP POSTメソッドを使用して情報を送信します。
これを示すために、まず簡単なHTMLフォームを作成します:
<html>
<body>
<form method="POST" action="demo_request.php">
Name: <input type="text" name="fname">
<input type="submit">
</form>
</body>
</html>
ユーザーが送信ボタンをクリックすると、フォームデータは<form>タグのaction属性で指定されたPHPファイルに送信されます。
アクションファイルでは、$_POST変数を使用して入力フィールドの値を収集できます。
$name = $_POST['fname'];
echo $name;
以下の例では、HTMLフォームとPHPコードを同じPHPファイルに配置しています。
セキュリティのためにいくつかの追加行も追加しています。
<html>
<body>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = htmlspecialchars($_POST['fname']);
if (empty($name)) {
echo "Name is empty";
} else {
echo $name;
}
}
?>
</body>
</html>
JavaScriptでHTTPリクエストを送信する際には、HTTPメソッドがPOSTであることを指定できます。
これを示すために、HTTPリクエストを含むJavaScript関数を作成します:
function myfunction() {
const xhttp = new XMLHttpRequest();
xhttp.open("POST", "demo_phpfile.php");
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.onload = function() {
document.getElementById("demo").innerHTML = this.responseText;
}
xhttp.send("fname=Mary");
}
上記のコードは以下の操作を行います:
リクエストが完了したときに実行される関数を見てみましょう:
xhttp.onload = function() {
document.getElementById("demo").innerHTML = this.responseText;
}
これは、id=”demo”のHTML要素に操作からの応答を書き込もうとします。
このような要素を持つHTMLページと、関数を実行するボタンも追加します。
JavaScriptも追加すれば、ページは次のようになります:
HTTPリクエストからデータを送信して受け取る方法:
<html>
<script>
function myfunction() {
const xhttp = new XMLHttpRequest();
xhttp.open("POST", "demo_ajax.php");
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.onload = function() {
document.getElementById("demo").innerHTML = this.responseText;
}
xhttp.send("fname=Mary");
}
</script>
<body>
<button onclick="myfunction()">Click me!</button>
<h1 id="demo"></h1>
</body>
</html>
このHTTPリクエストを受信するPHPファイル(demo_ajax.php)では、単純に$_POST変数を使用してfname変数を取得し、それを応答として書き込みます。
$name = $_POST['fname'];
echo $name;
$_REQUESTは、送信されたフォームデータとすべてのクッキーデータを含むPHPのスーパーグローバル変数です。
言い換えると、$_REQUESTは$_GET、$_POST、$_COOKIEからのデータを含む配列です。
フォームフィールドやクッキーの名前を指定して、次のようにこのデータにアクセスできます。
$_REQUEST['firstname']
POSTリクエストは通常、HTMLフォームから送信されるデータです。
次に示すHTMLフォームの例を見てください。
<html>
<body>
<form method="post" action="demo_request.php">
Name: <input type="text" name="fname">
<input type="submit">
</form>
</body>
</html>
ユーザーが送信ボタンをクリックすると、フォームデータは<form>タグのaction属性で指定されたPHPファイルに送信されます。
アクションファイルでは、$_REQUEST変数を使用して入力フィールドの値を収集できます。
$name = $_REQUEST['fname'];
echo $name;
以下の例では、HTMLフォームとPHPコードを同じPHPファイルに配置しています。
セキュリティのためにいくつかの追加行も追加しています。
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = htmlspecialchars($_REQUEST['fname']);
if (empty($name)) {
echo "Name is empty";
} else {
echo $name;
}
}
?>
</body>
</html>
GETリクエストは、上記の例のようにフォームの送信である場合もあります。HTMLの<form>要素のmethod属性がGETに設定されている場合です。
GETリクエストは、URLアドレスの後に追加されるクエリ文字列からのデータでもあります。
次に示すのは、クエリ文字列を持つHTMLハイパーリンクの例です。
<html>
<body>
<a href="demo_phpfile.php?subject=PHP&web=CodeLabJP">Test $GET</a>
</body>
</html>
ユーザーがリンクをクリックすると、クエリ文字列のデータがdemo_phpfile.phpに送信されます。
PHPファイルでは、$_REQUEST変数を使用してクエリ文字列の値を収集できます。
PHPファイル demo_phpfile.php:
<html>
<body>
<?php
echo "Study " . $_REQUEST['subject'] . " at " . $_REQUEST['web'];
?>
</body>
</html>
$_SERVERは、ヘッダー、パス、スクリプトの場所に関する情報を保持するPHPのスーパーグローバル変数です。
以下の例は、$_SERVERのいくつかの要素の使用方法を示しています。
echo $_SERVER['PHP_SELF'];
echo $_SERVER['SERVER_NAME'];
echo $_SERVER['HTTP_HOST'];
echo $_SERVER['HTTP_REFERER'];
echo $_SERVER['HTTP_USER_AGENT'];
echo $_SERVER['SCRIPT_NAME'];
次のテーブルには、$_SERVERに含めることができる主要な要素がリストされています。
要素/コード | 説明 |
---|---|
$_SERVER[‘PHP_SELF’] | 現在実行中のスクリプトのファイル名を返します |
$_SERVER[‘GATEWAY_INTERFACE’] | サーバーが使用しているCommon Gateway Interface (CGI)のバージョンを返します |
$_SERVER[‘SERVER_ADDR’] | ホストサーバーのIPアドレスを返します |
$_SERVER[‘SERVER_NAME’] | ホストサーバーの名前を返します(例: www.code-lab.jp) |
$_SERVER[‘SERVER_SOFTWARE’] | サーバーの識別文字列を返します(例: Apache/2.2.24) |
$_SERVER[‘SERVER_PROTOCOL’] | 情報プロトコルの名前とリビジョンを返します(例: HTTP/1.1) |
$_SERVER[‘REQUEST_METHOD’] | ページにアクセスするために使用されたリクエストメソッドを返します(例: POST) |
$_SERVER[‘REQUEST_TIME’] | リクエストの開始時刻のタイムスタンプを返します |
$_SERVER[‘QUERY_STRING’] | クエリ文字列が使用されてページにアクセスされた場合、そのクエリ文字列を返します |
$_SERVER[‘HTTP_ACCEPT’] | 現在のリクエストのAcceptヘッダーを返します |
$_SERVER[‘HTTP_ACCEPT_CHARSET’] | 現在のリクエストのAccept_Charsetヘッダーを返します(例: utf-8, ISO-8859-1) |
$_SERVER[‘HTTP_HOST’] | 現在のリクエストのHostヘッダーを返します |
$_SERVER[‘HTTP_REFERER’] | 現在のページの完全なURLを返します(すべてのユーザーエージェントがサポートしていないため、信頼性は低いです) |
$_SERVER[‘HTTPS’] | セキュアなHTTPプロトコル経由でスクリプトがクエリされているかどうかを示します |
$_SERVER[‘REMOTE_ADDR’] | ユーザーが現在のページを表示しているIPアドレスを返します |
$_SERVER[‘REMOTE_HOST’] | ユーザーが現在のページを表示しているホスト名を返します |
$_SERVER[‘REMOTE_PORT’] | ユーザーのマシンでウェブサーバーと通信するために使用されているポートを返します |
$_SERVER[‘SCRIPT_FILENAME’] | 現在実行中のスクリプトの絶対パス名を返します |
$_SERVER[‘SERVER_ADMIN’] | ウェブサーバーの設定ファイルで指定されたSERVER_ADMINディレクティブの値を返します(仮想ホストでスクリプトが実行されている場合、その仮想ホストのために定義された値になります)(例: someone@code-lab.jp) |
$_SERVER[‘SERVER_PORT’] | ウェブサーバーが通信に使用しているポートを返します(例: 80) |
$_SERVER[‘SERVER_SIGNATURE’] | サーバーバージョンと仮想ホスト名を返します(これらはサーバーが生成したページに追加されます) |
$_SERVER[‘PATH_TRANSLATED’] | 現在のスクリプトへのファイルシステムベースのパスを返します |
$_SERVER[‘SCRIPT_NAME’] | 現在のスクリプトのパスを返します |
$_SERVER[‘SCRIPT_URI’] | 現在のページのURIを返します |
$GLOBALSはすべてのグローバル変数を含む配列です。
グローバル変数とは、どのスコープからでもアクセス可能な変数です。
最も外側のスコープの変数は自動的にグローバル変数となり、関数の内部でも使用できます。
関数の内部でグローバル変数を使用するには、globalキーワードを使って明示的にグローバル変数であることを定義するか、$GLOBALS構文を使用します。
$x = 75;
function myfunction() {
echo $GLOBALS['x'];
}
myfunction();
グローバル変数として参照する必要がないほかのプログラミング言語とは違い、$GLOBALとして宣言しなかった場合、何も取得されないか、エラーがでます。
$x = 75;
function myfunction() {
echo $x;
}
myfunction();
また、globalキーワードを使用して関数内でグローバル変数を参照することもできます。
$x = 75;
function myfunction() {
global $x;
echo $x;
}
myfunction();
最も外側のスコープで作成された変数は、$GLOBALS構文を使用して作成されているかどうかに関わらず、グローバル変数となります。
$x = 100;
echo $GLOBALS["x"];
echo $x;
関数内で作成された変数はその関数にのみ属しますが、$GLOBALS構文を使用することで関数内でグローバル変数を作成することができます。
function myfunction() {
$GLOBALS["x"] = 100;
}
myfunction();
echo $GLOBALS["x"];
echo $x;
PHPの真の力は、関数を利用することで発揮されます。
PHPには直接呼び出せる1000以上の組み込み関数があります。これらはスクリプト内から特定のタスクを実行するために使用されます。
組み込みのPHP関数に加えて、独自のカスタム関数を作成することが可能です。
関数はプログラム内で繰り返し使用できる一連のステートメントです。
ユーザー定義関数の宣言は、キーワードfunctionで始まり、関数の名前が続きます:
function myMessage() {
echo "Hello world!";
}
注意: 関数名は文字またはアンダースコアで始める必要があります。関数名は大文字小文字を区別しません。
関数を呼び出すには、その名前の後に括弧()を付けて記述します:
function myMessage() {
echo "Hello world!";
}
myMessage();
この例では、myMessage()という関数を作成しています。
波括弧{は関数コードの開始を示し、閉じ括弧}は関数の終了を示します。
関数は”Hello world!”を出力します。
引数を介して関数に情報を渡すことができます。引数は単なる変数のようなものです。
引数は関数名の後ろに指定され、括弧内に記述されます。複数の引数を追加する場合は、コンマで区切ります。
1つの引数($fname)を持つ関数の例です。familyName()関数が呼び出されるとき、名前(“Jani”)を渡し、その名前が関数内で使用され、いくつかの異なる名前が同じ姓で出力されます:
function familyName($fname) {
echo "$fname Refsnes.<br>";
}
familyName("Jani");
familyName("Hege");
familyName("Stale");
familyName("Kai Jim");
familyName("Borge");
2つの引数($fname, $year)を持つ関数の例です:
function familyName($fname, $year) {
echo "$fname Refsnes. Born in $year <br>";
}
familyName("Hege", "1975");
familyName("Stale", "1978");
familyName("Kai Jim", "1983");
次の例は、デフォルトパラメータを使用する方法を示しています。引数なしでsetHeight()関数を呼び出すと、デフォルト値が引数として使用されます:
function setHeight($minheight = 50) {
echo "The height is : $minheight <br>";
}
setHeight(350);
setHeight(); // デフォルト値50が使用されます
setHeight(135);
setHeight(80);
関数が値を返すようにするには、return文を使用します:
function sum($x, $y) {
$z = $x + $y;
return $z;
}
echo "5 + 10 = " . sum(5, 10) . "<br>";
echo "7 + 13 = " . sum(7, 13) . "<br>";
echo "2 + 4 = " . sum(2, 4);
通常、PHPでは引数は値によって渡されます。これは、関数内で使用される値のコピーであり、関数に渡された変数は変更できません。
ある関数の引数が参照によって渡される場合、引数への変更は関数に渡された変数にも影響を与えます。引数を参照に変換するには、&演算子を使用します:
function add_five(&$value) {
$value += 5;
}
$num = 2;
add_five($num);
echo $num;
関数パラメータの前に…演算子を使用することで、関数は事前に引数の数が不明な場合でも柔軟に引数を受け入れることができます。これは可変長関数とも呼ばれます。
可変長関数の引数は配列になります。
function sumMyNumbers(...$x) {
$n = 0;
$len = count($x);
for($i = 0; $i < $len; $i++) {
$n += $x[$i];
}
return $n;
}
$a = sumMyNumbers(5, 2, 6, 2, 7, 7);
echo $a;
可変長引数は1つだけ指定でき、かつそれは最後の引数である必要があります。
例:
function myFamily($lastname, ...$firstname) {
txt = "";
$len = count($firstname);
for($i = 0; $i < $len; $i++) {
$txt = $txt."Hi, $firstname[$i] $lastname.<br>";
}
return $txt;
}
$a = myFamily("Doe", "Jane", "John", "Joey");
echo $a;
もし可変長引数が最後の引数でない場合、エラーが発生します。
上記の例で注意すべき点は、PHPには変数がどのデータ型であるかを明示する必要がないことです。
PHPはその値に応じて自動的にデータ型を関連付けます。データ型が厳密に設定されていないため、整数に文字列を追加するなどの操作がエラーを引き起こさないことがあります。
PHP 7では、型宣言が追加されました。これにより、関数を宣言する際に期待されるデータ型を指定することができ、厳密な宣言が追加されるとデータ型の不一致が発生すると”致命的エラー”がスローされます。
次の例では、strictを使用せずに数値と文字列を関数に送信し、strict宣言をしていないため、”5 days”はint(5)に変換され、10が返されます。
function addNumbers(int $a, int $b) {
return $a + $b;
}
echo addNumbers(5, "5 days");
strictを指定するには、最初のPHPファイルの最初の行にdeclare(strict_types=1);を設定する必要があります。
次の例では、数値と文字列を関数に送信しますが、strict宣言を追加しています:
<?php declare(strict_types=1); // strict requirement
function addNumbers(int $a, int $b) {
return $a + $b;
}
echo addNumbers(5, "5 days");
strict宣言により、意図した方法で使用することが強制されます。
PHP 7では、戻り値に対する型宣言もサポートされています。関数引数の型宣言と同様に、strict要件を有効にすると、タイプ不一致で”致命的エラー”がスローされます。
関数の宣言時に波括弧{の直前にコロン(:)と型を追加して戻り値の型を指定します。
次の例では、関数の戻り値の型を指定しています:
<?php declare(strict_types=1); // strict requirement
function addNumbers(float $a, float $b) : float {
return $a + $b;
}
echo addNumbers(1.2, 5.2);
引数の型とは異なる戻り値の型を指定することもできますが、戻り値が正しい型であることを確認してください
<?php declare(strict_types=1); // strict requirement
function addNumbers(float $a, float $b) : int {
return (int)($a + $b);
}
echo addNumbers(1.2, 5.2);
Continue文は、ループ内の現在の繰り返しを終了し、次の繰り返しに進むために使用されます。
Continue文は、forループ内で現在の繰り返しを終了し、次の繰り返しに進みます。
$xが4のとき、次の繰り返しに進みます:
for ($x = 0; $x < 10; $x++) {
if ($x == 4) {
continue;
}
echo "The number is: $x <br>";
}
ヒント
continue文は、指定した条件に達したときに現在の繰り返しをスキップします。
Continue文は、whileループ内で現在の繰り返しを終了し、次の繰り返しに進みます。
$xが4のとき、次の繰り返しに進みます:
$x = 0;
while($x < 10) {
if ($x == 4) {
continue;
}
echo "The number is: $x <br>";
$x++;
}
Continue文は、do...whileループ内で現在の繰り返しを終了し、次の繰り返しに進みます。
$iが3のとき、次の繰り返しに進みます:
$i = 0;
do {
$i++;
if ($i == 3) continue;
echo $i;
} while ($i < 6);
Continue文は、foreachループ内で現在の繰り返しを終了し、次の繰り返しに進みます。
$xが"blue"のとき、次の繰り返しに進みます:
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as $x) {
if ($x == "blue") continue;
echo "$x <br>";
}
Break文は、さまざまな種類のループから抜け出すために使用できます。
Break文は、forループから抜け出すために使用できます。
$xが4のとき、ループから抜け出します:
for ($x = 0; $x < 10; $x++) {
if ($x == 4) {
break;
}
echo "The number is: $x <br>";
}
ヒント
break文は、指定した条件に達したときにループから抜け出します。
Break文は、whileループから抜け出すために使用できます。
$xが4のとき、ループから抜け出します:
$x = 0;
while($x < 10) {
if ($x == 4) {
break;
}
echo "The number is: $x <br>";
$x++;
}
Break文は、do…whileループから抜け出すために使用できます。
$iが3のとき、ループを終了します:
$i = 1;
do {
if ($i == 3) break;
echo $i;
$i++;
} while ($i < 6);
Break文は、foreachループから抜け出すために使用できます。
$xが”blue”のとき、ループを終了します:
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as $x) {
if ($x == "blue") break;
echo "$x <br>";
}
foreachループは、配列の各要素またはオブジェクトの各プロパティに対してブロックのコードを繰り返し実行します。
最も一般的なforeachループの使用法は、配列の要素を繰り返し処理することです。
インデックス配列の要素を繰り返し処理します:
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as $x) {
echo "$x <br>";
}
ヒント
foreachループでは、配列の各要素に対してコードが繰り返し実行されます。
上記の配列はインデックス配列であり、最初の要素のキーは0、2番目の要素のキーは1といった具合です。
連想配列は異なり、連想配列ではキーに名前を割り当て、連想配列を繰り返し処理する際にキーと値の両方を保持したい場合があります。
次のように、foreachの定義でキーと値の両方を指定することができます:
$members配列からキーと値の両方を出力します:
$members = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
foreach ($members as $x => $y) {
echo "$x : $y <br>";
}
foreachループは、オブジェクトのプロパティを繰り返し処理するためにも使用できます。
$myCarオブジェクトのプロパティ名と値を出力します:
class Car {
public $color;
public $model;
public function __construct($color, $model) {
$this->color = $color;
$this->model = $model;
}
}
$myCar = new Car("red", "Volvo");
foreach ($myCar as $x => $y) {
echo "$x: $y <br>";
}
break文を使用すると、ループを強制的に終了させることができます:
$xが”blue”の場合、ループを終了します:
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as $x) {
if ($x == "blue") break;
echo "$x <br>";
}
continue文を使用すると、現在の反復処理を中断し、次の反復処理に進むことができます:
$xが”blue”の場合、現在の反復処理を中断し、次の反復処理に進みます:
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as $x) {
if ($x == "blue") continue;
echo "$x <br>";
}
配列の要素を繰り返し処理する際、デフォルトでは配列の要素に対して行った変更はオリジナルの配列に影響しません:
デフォルトでは、配列の要素の変更はオリジナルの配列に影響しません:
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as $x) {
if ($x == "blue") $x = "pink";
}
var_dump($colors);
しかし、foreach宣言で&文字を使用することで、配列の要素を参照で割り当てることができ、要素への変更がオリジナルの配列にも反映されます:
&文字を使用して配列の要素を参照で割り当て、変更をオリジナルの配列に反映します:
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as &$x) {
if ($x == "blue") $x = "pink";
}
var_dump($colors);
foreachループの構文は、endforeach文を使用して次のように記述することもできます:
インデックス配列の要素を繰り返し処理します:
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as $x) :
echo "$x <br>";
endforeach;