独り言

プログラミングの講師をしています。新人研修で扱う技術の解説と個人の技術メモ、技術書の紹介など

【PHP】PHP入門(導入~関数編)

目次

  • PHPとは
  • 環境構築
  • 変数
  • 演算
  • 制御構文
  • 配列
  • 関数

PHPとは

PHPは、Webアプリケーションの作成に特化したプログラミング言語で、正式名称は「Hypertext Preprocessor」です。
HTMLの中に直接ソースコードを埋め込むことができる言語です。
このような言語のことを「テンプレートエンジン」とも呼びます。
Webアプリケーションに特化した言語のため、WebではないGUIアプリケーションを作成することはできません。

PHPC言語で作成されたスクリプト言語です。
実行においてコンパイルは不要です。

環境構築と動作確認

詳しくは別記事に書きました。
https://case10.hateblo.jp/entry/2020/11/16/165122

ご自身の環境や好みに合わせて、XAMPPやMAMPなどのPHP動作環境をインストールしてください。
環境の他にIDEテキストエディタが必要です。
特にこだわりが無ければVisual Studio Code(以下、VS Code)がシンプルで使いやすいのでインストールしておいてください。
動作環境とテキストエディタのインストールが終わったら、XAMPP、あるいはMAMPを起動してWebサーバーを起動してください。

サーバーが起動したら、次は自分でPHPのファイルを作成して、それをブラウザで表示してみます。
それぞれの環境のドキュメントルート(XAMPPならC:\xampp\htdocs、MAMPならApplication/MAMP/htdocs、Linuxなら/var/www/html など)
の中にVS Codeを使って以下のファイルを作成してみます。

index.php

<?php
echo "Hello World";
?>

作成したら、ファイルを保存して、ブラウザで
http://localhost/ にアクセスします。
ブラウザに「Hello World」と表示されれば成功です。

まとめ

  • PHPはWebアプリケーション開発用のスクリプト言語
  • HTMLの中に埋め込むことができる
  • 動作させるにはWebサーバーとPHPが必要
  • 動作環境にはXAMPPやMAMPなどが必要

PHPの基本

先ほどのPHPのプログラムの解説をします。

index.php

<?php
echo "Hello World";
?>

ファイル名

PHPのプログラムのファイルの拡張子は「.php」となります。
ファイル名は任意ですが、Webサイトのトップページのファイル名はindexとなるのが慣習となっています。
ブラウザからPHPのプログラムを確認する場合、通常はファイル名まで指定する必要がありますが、ファイル名がindexの場合はファイル名を省略しても良いことになっています。
(Apacheでそのように設定されています。)

プログラムの書き方

PHPのプログラムは「<?php」と「?>」の中に書きます。

<?php
# ここにプログラムを書く
?>

ただ、ソースコードPHPのプログラムしか書かないのであれば、最後の「?>」の部分は省略可能です。

PHPはHTML上にソースコードを埋め込めるテンプレートエンジンなので、HTMLの中に書くことも可能です。

<body>
    <h1>Hello</h1>
    <?php 
        echo "hello";
    ?>
</body>

「echo」は、Webページ上に値を出力するための構文です。

<?php
echo 出力したい値;

と書くことでWebページ上に値を出力できます。

文字を出力する場合には"(ダブルクォーテーション)、または'(シングルクォーテーション)でくくります。
詳しくは文字列の説明で行います。

PHPでは、1つの処理(文)の最後には;(セミコロン)が必要になります。

コメント

PHPではソースコード上にコメントを書くことができます。
コメントとは、処理に影響を与えない部分のことです。
処理の補足説明を書いたり、一時的に処理を無効化したい場合になどに使用します。
PHPではコメントの書き方は3種類あります。

<?php
// 1行コメントです
#  1行コメントです
/*
 複数行コメントです
 */

// ⇓の処理は無効
// echo "Hello World";

echo 'Hello World';

様々な出力方法

ここまで、echoによってブラウザに文字を出力してきましたが、print関数を使って出力する方法もあります。
厳密にはprintは関数で、echoは関数ではないという違いがありますが、見かけ上に違いはありません。

<?php
echo 'Hello World';
// カッコで括ることも可能
echo ('Hello World');

// カンマ区切りでも書ける
echo 'Hello', 'World', '<br>';

// printでも出力可能
print 'Hello World';

まとめ

  • PHPファイルの拡張子は「.php
  • PHPのプログラムはブラウザからファイルのパスを指定することで実行される
  • ファイル名が「index.php」の場合はファイル名を省略することができる
  • PHPのプログラムは「<?php ~ ?>」の間に書く
  • 「echo」を使うことでWebページ上に値を出力することができる
  • 文の最後にはセミコロンが必要
  • PHPではコメントの種類が3つある
  • 出力の方法はechoとprintがある

変数とデータ型

変数

変数とは、データを格納する入れ物、またはデータにつけたラベルのようなものです。
プログラムとはコンピュータに対する指示書(命令)のことですが、コンピュータが何かを処理するとき、データを一時的に保存する必要が出てきます。
その時に使用されるのが変数です。

まずは例を確認。
ソースコードを修正してブラウザで確認してください。
index.php

<?php
// 変数への代入
$str = "Hello World";
// 変数の出力
echo $str;

このプログラムの中で使用されている「$str」が変数です。
変数を使用するときには必ずその変数に名前を付ける必要があり、そのつけた名前を変数名と呼びます。
変数に値をセットすることを代入と呼び、「=」記号を使用します。
この「=」のことを代入演算子と呼びます。
数学では「=」は同じという意味ですが、プログラムでは意味が異なるので注意しましょう。
変数名の付け方にはいくつかのルールがあります。

  • $マークから始まる
  • _(アンダースコア)と英数字のみ使用可能
  • $の次に数字は使えない

これらのルールを守らなければプログラムはエラーになります。

次に、エラーにはならないけれどPHPのプログラムを書く際に慣習となっているものもあります。

  • 変数名は分かりやすい名前で書く
  • 変数名はキャメルケースかスネークケースで書く(どっちにするかはプロジェクト次第?)
  • ひと昔前はスネークケースが一般的だったようだが、最近はキャメルケースが一般的のようです。

サンプルで見ていきましょう。
index.php

<?php
// OK
$name1 = "suzuki";

// OK
$name_ = "suzuki";

// NG $の後に数値は使えない
// $123 = 123;

// NG _以外の記号は使用できない
// $a-b

// OK キャメルケース
$userName = "suzuki";

// OK スネークケース
$user_name = "suzuki";

// 値が代入されていない変数の使用はできない
// echo $num;

PHPでは変数名は大文字と小文字を区別します。
$nameと$Nameでは異なる変数名となります。

データの型

PHPがプログラムで扱うことのできるデータにはいくつかの種類があり、それらはデータ型と呼ばれます。
主なデータ型は、文字列(string)、整数(integer)、小数(double, float)、真偽値(boolean)などがあります。
真偽値は、正しい(true)か間違い(false)かを判断する値で、2種類のみです。
比較演算子、条件分岐などで使用します。
また、値が何もないことを「null」というキーワードで表します。

index.php

<?php
// 文字列:string
$str1 = "Hello";
// 文字列:string
$str2 = 'Hello';
// 数値(整数):integer
$num1 = 100;
// 数値(小数):float
$num2 = 10.0
// 論理型:boolean
$bool1 = true;
$bool2 = false;
// 配列
$array1 = [10, 20, 30];
// 連想配列
$array2 = ['a' => 10, 'b' => 20, 'c' => 30];
// null
$var = null;

プログラムの中に直接書かれた値(ここでいう"Hello"や100など)のことをリテラルと呼びます。

変数の型を知りたい場合は、var_dumpという関数を使用します。

<?php
$num = 100;
$str = "Hello";
$bool = true;
var_dump($num);
var_dump($str);
var_dump($bool);

結果(表示のされ方は環境によって異なります。)

int 100
string 'Hello' (length=5)
boolean true

文字列

PHPのプログラム上で扱う文字は文字列といいます。
PHPでは文字列を扱うとき、3つの書き方があります。

  • "(ダブルクォーテーション)
  • '(シングルクォーテーション)
  • ヒアドキュメント

の3つです。
それぞれ違いがあるのでサンプルで見ていきます。

index.php

<?php
// 同じ。特に違いはない
$str1 = "Hello";
$str2 = "World";

// 変数展開
// "を使った文字列の場合、変数を入れると変数の値が展開される
$str3 = "Hello $str2";    // Hello World
$str3 = "Hello {$str2}";  // {}をつけても良い

// 'だと変数展開されない
$str4 = 'Hello $str2';   // 'Hello $str2'

index.php

<?php
// "の中では'は使用できる
$str1 = "'Hello'";
// 'の中でも"は使用できる
$str2 = '"Hello"';
// "の中で"を使用するにはエスケープ(前に\を付ける)が必要
$str3 = "\"Hello\"";
// 改行
$str4 = "Hello \n World";
// 'では特殊文字の改行はできない
$str5 = 'Hello \n World';
// ヒアドキュメント
// 長い文字列を扱うときに使用する
// TEXTの部分は任意
// ヒアドキュメントの終了はインデントができないので注意
$str6 = <<<TEXT
Hello
World
TEXT

// 以下のように終了の前にスペースを入れて書くとエラー
$str7 = <<<EOF
Hello
World
    EOF

まとめ

  • 変数とはデータを格納する入れ物、またはデータに付けたラベル
  • 変数名は$から始まり、英数字と_が使用できる
  • 変数名はキャメルケースで分かりやすい名前を付ける
  • 変数に値をセットすることを代入という
  • 変数に値を代入するときは「=」を使用する
  • プログラムに直接書いた値をリテラルと呼ぶ
  • データにはデータの種類(データ型)がある
  • データ型はstring, integer, float, booleanなどがある
  • 値がない状態はnullで表す
  • booleanの値はtrueとfalseの2種類
  • 文字列の書き方は、"(ダブルクォーテーション)、'(シングルクォーテーション)、ヒアドキュメントの3種類がある
  • "(ダブルクォーテーション)による文字列では変数展開やエスケープができる
  • 行を跨ぐ長い文字列を扱うときにはヒアドキュメントが使用できる

演算子

演算とはざっくりいえばコンピュータ上の処理のことです。
演算子と呼ばれる記号を使って演算処理を行います。
ここではPHPで使用することができる演算子をカテゴリごとに紹介します。

算術演算子

数値の演算で使用する演算子を算術演算子といいます。
PHPで利用できる算術演算子は加算(足し算)、減算(引き算)、乗算(掛け算)、除算(割り算)、剰余(割り算の余り)、べき乗があります。

index.php

<?php
// 加算
echo 1 + 2, "<br>";  // ブラウザ上で改行されて表示されるようにbrタグを付ける
// 減算
echo 10 - 5, "<br>";
// 乗算
echo 3 * 10, "<br>";
// 除算
echo 10 / 3, "<br>";    // 整数同士だと整数
echo 10.0 / 3, "<br>";  // 片方を小数にすると小数になる
// 剰余(割り算の余り)
echo 10 % 3, "<br>";
// べき乗
echo 3 ** 3, "<br>";

$num1 = 10;
$num2 = 20;
// 変数も使える
echo $num1 + $num2;

// 演算には優先順位がある
// 数値の場合は数学と同じ
// 足し算、引き算より、掛け算、割り算、剰余が優先される。べき乗が最も優先度が高い
echo 1 + 2 * 3;  // 7

// 優先順位を変える場合は()を使用する
echo (1 + 2) * 3; // 9

文字列結合

文字列を結合する場合には.(ピリオド)を使用します。
他の言語では文字列の加算は「+」を使用するものが多いですが、PHPでは文字列加算に「+」は使用できないので注意してください。
index.php

<?php
// 文字列結合
echo "Hello" . " World" . "<br>";
// ,で区切っても良い。結合の処理をしない分、,で出力する方が高速になる
echo "Hello" , " World" , "<br>";
// 数値との結合も可能
// 全体が1つの文字列として扱われる
echo "Hello" . 100;
echo "<br>";
echo 100 . "Hello";
echo "<br>";

代入演算子

変数に値を代入するときに使用される演算子です。
通常の代入では「=」を使用するのは今まで見てきたとおりです。
通常の代入以外に、元の変数に対して計算(あるいは文字列結合)した結果を代入できるものがあります。
計算結果を代入する式を簡略化して書きたい場合に使用されます。

index.php

<?php
// 通常の代入
$num = 10;
// 加算 
$num += 10;  // $num = $num + 10;  // 20
// 減算
$num -= 5;  // $num = $num - 10;   // 15
// 乗算
$num *= 3;  // $num = $num * 10;   // 45
// 除算
$num /= 5;  // $num = $num / 10;   // 9
// 剰余
$num %= 3;  // $num = $num % 10;   // 0

// 文字列結合
$str = "Hello";
$str .= " World";  // $str = $str + " World";  // Hello World

単項演算子

単項演算子は、インクリメント(1加算する)とデクリメント(1減算する)の2種類があります。
また、それぞれの演算子で、後置と前置の2種類があります。
それらは、1加算(減算)されるという意味では同じですが、評価されるタイミングが異なります。
繰り返し処理の中で、値を1ずつ変化させたい場合などによく使用します。

index.php

<?php
$num = 10;
// 後置インクリメント
echo $num++, '<br>';  // この時点では10
echo $num, '<br>';    // ここでは11
// 前置インクリメント
echo ++$num, '<br>';  // この時点で12
// 後置デクリメント
echo $num--, '<br>';  // この時点では12
echo $num, '<br>';    // ここでは11
// 前置インクリメント
echo --$num, '<br>';  // この時点で10

比較演算子

比較演算子は、左辺と右辺を比較し、結果を論理型の値(true, false)として評価する演算子です。
if文など、条件分岐の処理や、繰り返し処理の条件式の中で使用されることの多い演算子です。

<?php
$num1 = 10;
$num2 = 20;

echo true, '<br>';  // trueは表示するときは1と表示される
echo false, '<br>'; // falseは何も表示されない

// 値が等しい場合
echo $num1 == $num2, '<br>';  // 10 == 20  // false  表示:なし
// 型と値が等しい場合
echo $num1 === $num2, '<br>';  // 10 === 20 // false  表示:なし
// 値が異なる場合
echo $num1 != $num2, '<br>';  // 10 != 20  // true  表示:1
echo $num1 <> $num2, '<br>';  // 10 <> 20  // true  表示:1
// 型と値が異なる場合
echo $num1 !== $num2, '<br>';  // 10 !== 20 // true  表示:1
// 左辺が右辺以上の場合
echo $num1 >= $num2, '<br>';   // 10 >= 20  // false  表示:なし
// 左辺が右辺より大きい場合
echo $num1 > $num2, '<br>';    // 10 > 20 // false  表示:なし
// 左辺が右辺以下の場合
echo $num1 <= $num2, '<br>';   // 10 <= 20 // true  表示:1
// 左辺が右辺より小さい場合
echo $num1 < $num2, '<br>';    // 10 < 20  // true  表示:1

文字列同士の比較、文字列と数値の比較も可能です。

<?php
// 文字列の比較も可能
echo "10"=== "10", '<br>';  // true
// 文字列と数値でも、数値の値が同じならtrue
echo 10 == "10", '<br>';  // true
// ===の場合、型も一致している必要があるため、false
echo 10 === "10", '<br>';  // false

論理演算子

論理演算子は、論理型の値(true, false)を複数組み合わせて別の論理型の値に評価する演算子です。

index.php

<?php
$bool1 = true;
$bool2 = false;

// 論理積(アンド)
// 左辺と右辺がtrueの時true
echo $bool1 && $bool2, '<br>';   // true && false => false
echo $bool1 and $bool2, '<br>';  // 優先度低い
// 論理和(オア)
// 左辺か右辺のいずれかがtrueの時true
echo $bool1 || $bool2, '<br>';  // true || false => false
echo $bool1 or $bool2, '<br>';  // 優先度低い
// 排他的論理和
// いずれか1つがtrueの時にtrue
echo $bool1 xor $bool2, '<br>';  // true xor false => true
// 否定
echo !$bool1, '<br>';  // !true => false

// && と || では&&の方が優先度が高い
// 右が先に評価される
echo $bool1 || $bool2 &&  $bool1, '<br>';   // true
// 順番を変えるには()を使用する
echo ($bool1 || $bool2) &&  $bool1, '<br>'; // false
// &&, || の方がand, orよりも優先度が高い。
echo $bool1 || $bool2 and $bool1, '<br>';   // false

キャスト演算子

キャスト演算子は、元々の値を別の型に変換するときに使用される演算子です。

論理型(boolean)へのキャスト

<?php

// 文字列
// 空白, "0" ⇒ aflse, それ以外 ⇒ true
$bool = (bool)"", '<br>';  // false
$bool = (bool)"0", '<br>';  // false
$bool = (bool)"A", '<br>';  // true

// 数値
// 0, 0.0 ⇒ false, それ以外 ⇒ true 
$bool = (bool)0, '<br>';   // false
$bool = (bool)10, '<br>';  // true

// 配列      
// 要素数が0の配列 ⇒ false, それ以外 ⇒ true 

// 論理値   
// true ⇒ true, false ⇒ false

// その他   
// null ⇒ false

演算子のまとめ


制御構文

プログラムは基本的には上から順に書かれている内容が実行されていきます。
しかし、複雑な処理をする場合、上から順番に処理を行うだけでは実行できない場合がほとんどです。
大抵のプログラムでは、条件によって処理を分けたり、同じ処理を何度か繰り返し実行したりします。
条件によって処理を分けたり、繰り返し処理をするための構文を制御構文といいます。

条件分岐

まずは特定の条件によって処理を分けたい場合に使う条件分岐を見ていきます。
条件分岐にはif文とswitch文があります。

if文

ifは日本語で「もし~ならば」という表現を表すための英語です。
if文を使うと条件によって処理を分けることができます。

単純なif文の構文

<?php
// 条件を満たすときだけ処理が実施される
// 条件を満たさない場合は何も処理されない
// 条件式には結果が論理型になるものを書く
if (条件式) {
    // 処理な何行でも書ける
    条件式がtrueの場合の処理
}
?>

ifの省略形

<?php
// 処理が1行の場合のみ、中かっこを省略することが可能
if (条件式)
    条件式がtrueの場合の処理

条件を満たす場合と満たさない場合で処理を分けたい場合は、if~else文を使用します。
if~else文の構文

<?php
// 必ずどちらかの処理が実行される
if (条件式) {
    条件式がtrueの場合の処理
} else {
    条件式がfalseの場合の処理
}

処理を2パターンではなく、さらに細かく分けたい場合には、elseifを使用します。
elseifを使った構文

<?php
if (条件式1) {
    条件式1がtrueの場合の処理
} elseif (条件式2) {
    条件式2がtrueの場合の処理
} else {  // elseは必要なければ省略可
    どれにも合致しなかった場合の処理
}

if文を使った例
index.php

<?php
$num = 60;
// if
if($num <= 80) {
    echo "80以下です。<br>";
}

// if {}の省略
if($num <= 100) 
    echo "100以下です。<br>";

// 論理演算子を使用する
if($num <= 100 && $num >= 50)
    echo "50以上100以下です。<br>";

if($num > 100 || $num < 50)
    echo "100より大きい、または50より小さいです。<br>";

$num = 120;
// if~else
if($num <= 100) {
    echo "100以下です。<br>";
} else {
    echo "100以上です。<br>";
}
$num = 70;
// if~elseif~else
if($num <= 50) {
    echo "50以下です。<br>";
} elseif ($num <= 100) {
    echo "50以上100以下です。<br>";
} else {
    echo "100以上です。<br>";
}

// この例では、elseifが絶対に通らない
// if~elseifを使用するときは、条件の順番に注意する
// if($num <= 100) {
//     echo "100以下です。<br>";
// } elseif ($num <= 50) {
//     echo "50以上です。<br>";
// } else {
//     echo "50以下です。<br>";
// }

switch文

if文以外の条件分岐を実現する方法としてswitch文があります。

switch文の構文

<?php
switch () {    
    case:   
        処理
        break;
    default;
        処理
        break;
}

switch文では、式の部分の値が、caseの値(ラベルと呼びます)と一致した場合に、中の処理が実行されます。
caseはいくつでも書くことができます。
breakは書かなくてもエラーにはなりませんが、breakを書かないと、処理が終了せず、次の処理まで実行されます。
defaultは、式の値がどのcaseラベルとも一致しなかったときに実行されます。
defaultは省略することも可能です。

switch文でできることは大抵の場合if文でも実現可能です。
if文の条件式が「==」または「===」を使って比較している場合に、switch文に置き換えることができます。

index.php

<?php
// Aが出力される
$str = "a";
switch ($str) {
    case "a";
        echo "A";
        break;
    case "b";
        echo "B";
        break;
    case "c";
        echo "C";
        break;
    default:
        echo "D";
        break;
}
echo "<br>";

// breakなし
// ABCDと表示される
switch ($str) {
    case "a";
        echo "A";
    case "b";
        echo "B";
    case "c";
        echo "C";
    default:
        echo "D";
}

// 数値も可
$num = 10;
switch ($num) {
    case "10";  // 文字列とも比較可能
        echo "10";  // 10が表示される
        break;
    case "20";
        echo "20";
        break;
    case "30";
        echo "30";
        break;
    default:
        echo "40";
        break;
}

三項演算子

三項演算子は、if elseによる代入を簡単にする構文です。

構文

変数 = 条件式 ? 条件がtrueの時の値 : falseの時の値
<?php 
$num = 90;
$str = $num >= 80 ? "合格です" : "不合格です";

// if elseでも書ける
if ($num >= 80) {
    $str = "合格です";
} else {
    $str = "不合格です";
}

三項演算子は初心者には分かりにくく、推奨されないこともありますが、場合によっては分かりやすく書けることもあるので知っておくと良いでしょう。

繰り返し文

プログラムでは同じ処理を何度も繰り返し処理したい場合があります。
そのような場合に使用するのが繰り返しの構文です。
繰り返しの構文にはfor文とwhile文があります。

for文

まずはfor文から見ていきます。

構文

<?php
for(初期化; 条件式; 後処理) {
    繰り返したい処理
}

for文では、条件式の条件がtrueの間処理が続きます。
初期化の処理は最初の1回だけ実行され、後処理はfor文の中の処理が実行された後に毎回実行されます。

index.php

<?php
// 初期化で$iに0をセットする
// $iが10より小さい間処理を実行する
// 1回の処理が終わるごとに1加算する
// 0123456789 が出力される
for($i = 0; $i < 10; $i++) {
    echo $i;
}

echo "<br>";

// if文同様処理が1行だけの場合は{}省略可能
for($i = 0; $i < 10; $i++) 
    echo $i;

// 1~10までの値を足す
$sum = 0;
for($i = 1; $i <= 10; $i++) {
    $sum += $i;
}
// 合計値を出力 55
echo $sum;

while文

続いてはwhile文を見ていきます。
while文はfor文よりもシンプルです。

<?php
while(条件式) {
    繰り返したい処理
}

サンプルの処理内容はfor文と同じです。
index.php

<?php
$i = 0;
// 0123456789
while($i < 10) {
    echo $i;
    $i++;
}

echo "<br>";

$sum = 0;
$i = 1;
while($i <= 10) {
    $sum += $i;
    $i++;
}
echo $sum; // 55

// 以下は無限ループ
// while(true) {
//     echo "Hello";
// }

for文とwhile文の使い分けですが、あらかじめ繰り返しの回数が分かっている場合は、for文を使用します。
繰り返し回数が動的に変更するような場合は、while文を使用します。

while文は、条件式しか書かないので、条件がいつまでのtrueのままで処理が終了しないという状況になることがあります。
このような状況を無限ループと言います。
無限ループになったらプログラムを停止するまで動作し続けるので、while文を使用するときは無限ループにならないように注意しましょう。

while文と似た構文でdo~while文という書き方もあります。
構文

<?php
do {
    繰り返したい処理
} while(条件式)

while文は処理実行前に条件式を評価するのに対し、do~while文は処理実行後に条件式を評価します。
これにより、最初の1回の処理が必ず実行されるかどうかの違いが出ます。
while文の場合、条件式を満たさない場合は処理は1度も実行されませんが、do~whileの場合、最初の1回は必ず実行されます。

breakとcontinue

for文とwhile文の繰り返し処理を制御するための構文として、breakとcontinueがあります。

continueは、その周の処理を飛ばして次の繰り返し処理が実行されます。
breakは、forあるいはwhileの処理自体を抜けることができます。

index.php

<?php

// 偶数の時に処理を飛ばす
// 奇数のみ表示
for($i = 0; $i < 10; $i++) {
    if($i % 2 == 0) {
        continue;
    }
    echo $i;
}

echo "<br>";

// 1から足していき、合計が500を超えたら繰り返し処理終了
$sum = 0;
for ($i = 1; $i <= 100; $i++) {
    $sum += $i;
    if($sum >= 500) {
        break;
    }
}
echo $sum;

配列

配列とは、一言でいえば、複数のデータをまとめて管理するための仕組みです。
1つのデータを扱うのであれば、変数が1つあればよいですが、5つのデータをまとめて管理したい場合、変数をわざわざ5つ用意するのは面倒です。
このような場合に配列を使うと、効率よくデータを処理することができます。

普通の配列

<?php

// 配列の用意 // 5つのデータを格納
// 一つ一つの値のことを要素という
$score = [70, 80, 75, 85, 90];
// $score = array(70, 80, 75, 85, 90);  // こういう書き方もできる

// アクセスするには[]の中に何番目かを指定する
// 数値は0から始まるので注意
echo $score[0];  // []の中の数値を添え字という
echo '<br>';

// echo $score[5];  // 要素数を超えた場合はエラー(Notice)
// echo $score[-1]; // 負の値で参照した場合もエラー(Notice)

// 既存の要素の上書き
$score[1] = 83;
echo $score[1], '<br>';

// 最後に要素を追加
$score[] = 95;
echo $score[5], '<br>';  // 追加されたか確認

// ループでの処理
// countで要素数を取得できる
$sum = 0;
for($i = 0; $i < count($score); $i++) {
    $sum += $score[$i];
}

echo $sum, '<br>';

// foreach
// 配列用のループ。こちらの方がよく使用される
// 配列の要素数分ループする
// foreach(配列名 as 要素を格納する変数)
$sum = 0;
foreach($score as $s) {
    $sum += $s;
}
echo $sum, '<br>';

// 数値以外も格納可能
$names = ['suzuki', 'satou', 'takahashi'];

// 異なる型で混在もできる
// 混乱するしバグの元なのでやらない方が良いけど
$dates = [10, "ABC"];

連想配列

<?php

// 添え字が整数ではなく文字列になる配列を連想配列という
// $score[key => value, ...]と書く
$score = ['suzuki' => 80, 'satou' => 90];

// keyを指定してアクセスする
echo $score['suzuki'], '<br>';

// 値の上書き
$score['suzuki'] = 85;
echo $score['suzuki'], '<br>';

// 値の追加
$score['takahashi'] = 95;
echo $score['takahashi'], '<br>';

// ループ処理
// 値だけを取り出す
$sum = 0;
foreach($score as $s) {
    $sum += $s;
}
echo $sum, '<br>';

// ループ処理
// keyとvalueも取り出す
foreach($score as $key => $value) {
    echo $key . 'の点数は' . $value . 'です', '<br>';
}

配列で使用される関数

<?php

$score = [80, 75, 90, 65, 85];

// 配列の要素の値とデータ型をまとめて確認する
var_dump($score);

// 配列の要素の値をまとめて確認する
print_r($score);

// 要素数を取得
echo count($score), '<br>';

// 昇順に並び替える
sort($score);
var_dump($score);

// 降順に並び替える
rsort($score);
var_dump($score);

// ランダムに入れ替える
shuffle($score);
var_dump($score);

// 末尾から値を取り出す
$s = array_pop($score);
echo $s , '<br>';

// 末尾に要素追加
array_push($score, 78);
var_dump($score);

// 先頭から要素削除
array_shift($score);
var_dump($score);

// 先頭に要素追加
array_unshift($score, 100);
var_dump($score);

$add_array = [200, 300, 400];

// 配列をマージ
$new_array = array_merge($score, $add_array);
var_dump($new_array);

// 配列の一部から別の配列を生成
// 添え字2の要素から要素数3の配列を生成
$sub_array = array_slice($new_array, 2, 3);
var_dump($sub_array);

$seq_array = range(1, 10);
var_dump($seq_array);

// 要素削除
unset($score);

連想配列で使用される関数

<?php

$fruits = ['banana' => 200, 'apple' => 120, 'orange' => 80, 'grape' => 300];

var_dump($fruits);

// keyで昇順にソート
ksort($fruits);
var_dump($fruits);

// keyで降順にソート
krsort($fruits);
var_dump($fruits);

// 配列から変数を作る
extract($fruits);
// keyの名前が変数名となり、valueが値となる
echo $apple , '<br>';
echo $banana , '<br>';
echo $orange , '<br>';

// 変数から配列を作る
// extractの逆
// compact

array_map
array_filter

<?php

$array = [10, 11, 12, 13, 14, 15];

// 全ての要素を2倍にする
$new_array = array_map(function($v) {
    return $v * 2;
}, $array);

var_dump($new_array);

// 偶数のみ取得
$even = array_filter($array, function($v) {
    return $v % 2 === 0;
});

var_dump($even);

// 組み合わせ
// 偶数のみを2倍にして返す
$even_double = array_map(function($v) {
    return $v * 2;
}, array_filter($array, function($v) {
    return $v % 2 === 0;
}));

var_dump($even_double);

配列まとめ

  • 配列はデータをまとめて扱う仕組み
  • 配列の添え字は0から始まる
  • 文字列と値がセットの配列を連想配列という
  • 配列をループで処理する場合はforeachを使用する
  • PHPでは配列を操作する関数が色々と用意されている

関数

関数とは、一言でいえば処理をひとまとめにしたものです。
処理をまとめる仕組みは様々なプログラミング言語で用意されており、サブルーチンやプロシージャなどと呼ばれることもあります。
オブジェクト指向が関係するとメソッドと呼ばれることもあります。

関数の定義

<?php
function 関数名(引数) 
{
    処理
    return 戻り値;
}

関数名は任意ですが、何の処理をしているのかが分かりやすい名前にします。
引数は関数が受け取ることができる値です。
引数はなしでも構いません。
また、デフォルト値を設定することもできます。
returnでは、関数の呼び出し元に値を返すことができます。
また、returnが処理されると、それ以降に処理があったとしてもその時点で処理が終了します。
戻り値がない場合(関数を呼び出した側に結果を返す必要がない場合)は省略することも可能です。

関数定義と呼び出しのサンプル

<?php

// FizzBuzz
// 受け取った数値が3で割れる場合はFizz, 5で割れる場合はBuzz, 両方で割れる場合はFizzBuzzと返す
// それ以外は数値をそのまま返す
function FizzBuzz(int $num)
{
    if ($num % 15 == 0) {
        return 'FizzBuzz';
    } elseif ($num % 3 == 0) {
        return 'Fizz';
    } elseif ($num % 5 == 0) {
        return 'Buzz';
    } else {
        return $num;
    }
}

// メソッドの呼び出し
echo FizzBuzz(3) , '<br>';
echo FizzBuzz(5) , '<br>';
echo FizzBuzz(8) , '<br>';
echo FizzBuzz(15) , '<br>';

様々な関数の形

<php
// 引数なし
function Hello()
{
    return 'Hello';
}
// 呼び出し
echo Hello() . '<br>';

// 戻り値なし
function HelloWorld()
{
    echo 'Hello World <br>';
}
// 呼び出し
HelloWorld();

// 引数にデフォルト値を設定
function judge(int $score = 0)
{
    if ($score >= 80) {
        return "合格";
    } else {
        return "不合格";
    }
}

echo judge(100) . '<br>';
// 引数なしで呼び出し
echo judge() . '<br>'; // デフォルト値が使用される

// 同じソースコード内で同じ名前の関数は作成できない
// 他の言語ではオーバーロードという概念がある言語もあるが、PHPにはない。デフォルト値によって対応する
// function judge() {
// }


$num = 100;
function calc()
{
    // グローバル変数
    // 関数外の変数を使用できる
    global $num;  
    $num += 100;

    // ローカル変数
    // 関数外では使用できない
    $str = "Hello";

}
calc(); // 100足される
echo $num . '<br>';
// echo $str; // 使用不可

function add(int $a)
{
    // 静的変数
    // プログラムが終了するまで値が保持される
    static $num;
    $num += $a;
    return $num;
}
add(100);  // $numに100加算
echo add(100) . '<br>';  // さらに100加算して200になる


$a = 10;
$b = 10;
// 引数に&を付けると参照渡しになる
// 通常引数は値がコピーされるため、引数の変数の値を変更しても呼び出し元に影響を与えないが
// 参照渡しの場合、呼び出し元の値も変更することができる
function change($a, &$b) 
{
    $a += 10;
    $b += 10;
}
change($a, $b);
echo $a . '<br>';
echo $b . '<br>';

// TODO
// 可変長引数

データ型の指定

関数の引数や戻り値ではデータ型を指定することもできます。
データ型を指定することで、プログラムのミスを減らし、安全性を高める効果があります。

<?phpfunction add(int $a, int $b): int
{
    return $a + $b;
}
echo add(1, 2), '<br>';  // 3が表示される

ただし、このままの状態だと、関数を呼び出すときに異なるデータ型を指定することも可能です。

<?phpfunction add(int $a, int $b): int
{
    return $a + $b;
}
// 文字列にしても同様の結果になる
echo add('1', '2'), '<br>';

厳密な型チェックをしたい場合にはdeclare宣言を追加します。
declareは最初の「<?php」宣言の中に書く必要があることに注意してください。

<?php
declare(strict_types=1);
function add(int $a, int $b): int
{
    return $a + $b;
}
//エラーになる 
echo add('1', '2'), '<br>';

処理によっては引数や戻り値にnullを許可したい場合もあります。
普通に型を指定するだけではnullは許可されず、引数でnullを渡したり、returnでnullを返すとエラーになります。
nullを許可するためには型の前に?を指定する必要があります。

<?php
declare(strict_types=1);
function add(int $a, int $b): int
{
    if ($a > 0 && $b > 0) {
        return $a + $b;
    } else {
        return null;
    }
}
echo add(1, -2), '<br>';

標準関数の使用

PHPではあらかじめ多くの関数が用意されています。
標準ライブラリとも呼ばれます。
これらの中から一部をご紹介します。

<?php

$num = 10.5;

// 切り上げ
echo ceil($num) . '<br>';
// 切り捨て
echo floor($num) . '<br>';
// 四捨五入
echo round($num) . '<br>';
// 1から10の間のランダム
echo rand(1, 10) . '<br>';

$str = "Hello";

// 文字列の長さ
echo strlen($str) . '<br>';
// 大文字に置換
echo mb_strtoupper($str) . '<br>';
// 部分文字列
// 2文字目から3文字文
echo mb_substr($str, 1, 3) . '<br>';

// 型を調べる
echo gettype($str) . '<br>';

ここで紹介した関数は一部です。
詳しくはマニュアルなどを調べながら活用してください。

関数まとめ

  • 関数とは処理をひとまとめにしたもの
  • 関数では引数で値を受け取ることができる
  • 引数はいくつでも受け取ることができる
  • 引数はなくてもよい
  • 引数にはデフォルト値を設定することができる
  • 関数では戻り値で呼び出し元に値を返すことができる
  • 関数はあらかじめ色々用意されている