第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


配列以外の型に対する配列操作

配列専用の関数(countarray_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'を表示してみてください。