第8章 配列
配列の基本
PHPの配列は、値の集合を格納するためのデータ型です。配列は0から始まるインデックスでアクセスできます。以下は配列の宣言と使用の例です。
$fruits = array("Apple", "Banana", "Cherry");
echo $fruits[0]; // 出力: Apple
echo $fruits[1]; // 出力: Banana
echo $fruits[2]; // 出力: Cherry
連想配列
PHPの連想配列は、文字列または数値をキーとして値にアクセスすることができる配列です。以下に連想配列の作成と要素の取得の例を示します。
$ages = array("John" => 35, "Mary" => 25, "Bob" => 45);
echo $ages["John"]; // 出力: 35
echo $ages["Mary"]; // 出力: 25
echo $ages["Bob"]; // 出力: 45
多次元配列
多次元配列は、配列の中にさらに配列が含まれる構造です。これはデータをより複雑な形で格納するのに便利です。以下に多次元配列の使用例を示します。
$matrix = array(
array(1, 2, 3),
array(4, 5, 6),
array(7, 8, 9)
);
echo $matrix[0][0]; // 出力: 1
echo $matrix[1][1]; // 出力: 5
echo $matrix[2][2]; // 出力: 9
配列操作関数
PHPには配列を操作するための様々な関数があります。以下にいくつかの例を示します。
$fruits = array("Apple", "Banana", "Cherry");
array_push($fruits, "Orange"); // 配列の最後に要素を追加
print_r($fruits); // 出力: Array ( [0] => Apple [1] => Banana [2] => Cherry [3] => Orange )
$last = array_pop($fruits); // 配列の最後の要素を取り出す
echo $last; // 出力: Orange
print_r($fruits); // 出力: Array ( [0] => Apple [1] => Banana [2] => Cherry )
$length = count($fruits); // 配列の要素数を取得
echo $length; // 出力: 3
配列関連のエラーと対策
配列を使用する際には、特定のエラーに注意する必要があります。例えば、存在しないインデックスやキーへのアクセス、配列以外の型に対する配列操作などがあります。これらのエラーを避けるためには、適切なチェック(issetやis_arrayなど)を行うことが重要です。
非存在のインデックスへのアクセス
配列のインデックスは、その配列の有効な範囲内でなければなりません。つまり、配列に存在しないインデックスを参照すると、エラーが発生します。これは通常、「Undefined offset」エラーとして表示されます。
$fruits = array("Apple", "Banana", "Cherry");
echo $fruits[5]; // エラー: Undefined offset: 5
非存在のキーへのアクセス
連想配列では、存在しないキーを参照すると、「Undefined index」エラーが発生します。
$ages = array("John" => 35, "Mary" => 25, "Bob" => 45);
echo $ages["Alice"]; // エラー: Undefined index: Alice
配列以外の型に対する配列操作
配列専用の関数(count、array_pushなど)を、配列ではない型(例えば、整数や文字列など)に対して実行しようとすると、「Warning」エラーが発生します。
$count = count("Apple"); // エラー: count(): Parameter must be an array or an object that implements Countable
isset関数
isset()関数は変数がセットされていて、そしてnullでない場合にtrueを返します。配列に特定のキーが存在するかどうかを確認するのによく使われます。
$array = array("apple" => "red", "banana" => "yellow");
echo isset($array["apple"]); // 出力: 1 (trueを意味します)
echo isset($array["orange"]); // 出力: (何も出力されません, falseを意味します)
array_key_exists関数
array_key_exists()関数は配列に特定のキーが存在するかどうかを確認します。
$array = array("apple" => "red", "banana" => "yellow");
echo array_key_exists("apple", $array); // 出力: 1 (trueを意味します)
echo array_key_exists("orange", $array); // 出力: (何も出力されません, falseを意味します)
is_array関数
is_array()関数は引数が配列である場合にtrueを返します。
$array = array("apple", "banana");
$nonArray = "apple";
echo is_array($array); // 出力: 1 (trueを意味します)
echo is_array($nonArray); // 出力: (何も出力されません, falseを意味します)
in_array関数
in_array()関数は配列に特定の値が存在するかどうかを確認します。
$array = array("apple", "banana");
echo in_array("apple", $array); // 出力: 1 (trueを意味します)
echo in_array("orange", $array); // 出力: (何も出力されません, falseを意味します)
その他の配列操作関数
array_shift
配列の最初の要素を削除し、その値を返します。
$array = array("apple", "banana", "cherry");
$first = array_shift($array);
echo $first; // apple
array_unshift
配列の先頭に一つ以上の要素を追加します。
$array = array("banana", "cherry");
array_unshift($array, "apple");
print_r($array); // Array ( [0] => apple [1] => banana [2] => cherry )
array_keys
配列の全てのキーを新たな配列として返します。
$array = array("apple" => 1, "banana" => 2, "cherry" => 3);
print_r(array_keys($array)); // Array ( [0] => apple [1] => banana [2] => cherry )
array_values
配列の全ての値を新たな配列として返します。
$array = array("apple" => 1, "banana" => 2, "cherry" => 3);
print_r(array_values($array)); // Array ( [0] => 1 [1] => 2 [2] => 3 )
array_merge
配列の全ての値を新たな配列として返します。
$array1 = array("apple", "banana");
$array2 = array("cherry", "date");
$result = array_merge($array1, $array2);
print_r($result); // Array ( [0] => apple [1] => banana [2] => cherry
実例
各生徒の科目別のテストスコアを管理するプログラム
// 生徒と各科目のテストスコアを保持する連想配列
$students = array(
"Taro" => array("math" => 85, "science" => 90, "english" => 78),
"Hanako" => array("math" => 79, "science" => 84, "english" => 88),
"Jiro" => array("math" => 92, "science" => 78, "english" => 85)
);
// 各生徒の各科目のスコアを出力
foreach ($students as $name => $scores) {
echo $name . "の成績:\n";
foreach ($scores as $subject => $score) {
echo $subject . ": " . $score . "\n";
}
echo "\n";
}
各科目ごとの平均点を出力するプログラム
// 各科目のスコアの合計と数を保存するための連想配列を初期化
$sumScores = array("math" => 0, "science" => 0, "english" => 0);
$countScores = array("math" => 0, "science" => 0, "english" => 0);
// 各生徒のスコアを見ていき、スコアの合計とスコアの数を更新する
foreach ($students as $name => $scores) {
foreach ($scores as $subject => $score) {
$sumScores[$subject] += $score;
$countScores[$subject]++;
}
}
// 各科目の平均得点を出力
foreach ($sumScores as $subject => $sumScore) {
$average = $sumScore / $countScores[$subject];
echo $subject . "の平均得点: " . $average . "\n";
}
各科目ごとの最高得点とその生徒の名前を出力するプログラム
// 最高得点とその生徒の名前を保持するための連想配列を初期化
$highestScores = array(
"math" => array("name" => "", "score" => 0),
"science" => array("name" => "", "score" => 0),
"english" => array("name" => "", "score" => 0)
);
// 各生徒のスコアを見ていき、最高得点を更新する
foreach ($students as $name => $scores) {
foreach ($scores as $subject => $score) {
if ($score > $highestScores[$subject]["score"]) {
$highestScores[$subject]["name"] = $name;
$highestScores[$subject]["score"] = $score;
}
}
}
// 各科目の最高得点を得た生徒の名前とその点数を出力
foreach ($highestScores as $subject => $info) {
echo $subject . "の最高得点者: " . $info["name"] . "(" . $info["score"] . "点)\n";
}
練習問題1.
以下の名前を要素とする配列を作成してください。
'Yamada', 'Tanaka', 'Suzuki'
作成した配列の各要素をechoを使用して表示してみてください。
練習問題2.
以下のキーと値のペアを持つ連想配列を作成してください
- 'name' => 'Yamada'
- 'age' => 25
- 'city' => 'Tokyo'
print_rを使用して、作成した連想配列を表示してみてください。
練習問題3.
以下のような2次元配列を作成してください。
- 'Yamada' => ['age' => 25, 'city' => 'Tokyo']
- 'Tanaka' => ['age' => 30, 'city' => 'Osaka']
'Yamada'の'city'を表示してみてください。
'Tanaka'の'age'を表示してみてください。