PHPの基礎 - 配列
概要
配列は、数値や文字列等と同様にデータ型の1つであり、キーと値のペアからなる要素を複数管理することができる。
ここでは、PHPにおける配列の使用方法について記載する。
配列の基礎
配列は、繰り返し文や配列のために用意された構文や関数等を使用して、効率的に格納された値を処理することができる。
以下の例では、配列resultを1つ定義して、各要素に値を格納している。
配列から値を取得するために、値とは別に重複しない値を持つインデックスを合わせて格納する。
格納する時は、インデックスと値をペアで格納し、取得する時は、インデックスを指定することで指定の値を取得することができる。
// 1つずつ定義
$result1[0] = 85;
$result1[1] = 92;
$result1[2] = 68;
print $result1[0];
print $result1[1];
print $result1[2];
// まとめて定義
$result2[0] = [85, 92, 68];
print $result2[0];
print $result2[1];
print $result2[2];
以下の例では、配列と繰り返し文と組み合わせている。
$result[0] = 85;
$result[1] = 92;
$result[2] = 68;
for ($i = 0; $i < 3; $i++) {
print $result[$i];
}
// count関数を使用する場合
$size = count($result);
for ($i = 0; $i < $size; $i++) {
print $result[$i];
}
詳細は、次のセクション以降で解説するが、配列のインデックスには整数と文字列を使用することができる。
インデックスに整数を使用する場合は繰り返し文等でインデックスの値を変化させることで、順に値を取得することができる。
また、以下の例のように、配列のために用意されたforeach
文を使用することもできる。
$result[0] = 85;
$result[1] = 92;
$result[2] = 68;
foreach($result as $val)
{
print $val;
}
配列への値の格納と取得
配列は、複数のデータを管理しており、1つ1つは要素と呼ばれる。要素には、インデックスと値のペアが格納される。
インデックスは、配列の中から値を取り出す時の目印になるもので、1つの配列の中に同じインデックスは存在しない。
インデックスを指定することで要素を特定でき、要素の中に含まれる値を取得することができる。
配列を定義するには、以下のように記述する。
$配列名
変数と同様、配列も事前に宣言する必要は無く、存在していない配列に値を格納する時に配列が自動的に作成される。
配列名として使用できる文字は、変数と同様、先頭がアンダーバーかアルファベットで始まり、その後にアンダーバー、数字、アルファベットが続く。
配列の中で特定の要素を表すには、配列の後に角括弧[]
でインデックスを囲み指定する。
$配列名[インデックス]
新しい要素を作成して値を格納するには、以下のように記述する。
$配列名[インデックス] = 値;
配列の中に既に存在しているインデックスを指定する場合、インデックスによって決まる要素に対して新しい値を格納する。
存在しないインデックスを指定する場合、新しい要素を作成して値を格納する。
配列から値を取得するには、以下のように要素を記述する。
$変数 = $配列名[インデックス];
インデックスの指定方法は、整数または文字列を指定することができる。(次のセクションに詳細を記載する)
$result['eigo'] = 72;
$result['suugaku'] = 82;
$name[0] = '山田';
$name[1] = '高橋';
print $name[0];
配列に含まれている値を確認するには、print_r関数を使用すると便利である。
print_r関数の引数に配列を指定すると、配列に含まれる要素の一覧を出力される。
開発段階において、配列の内容を確認する場合によく使用されるため、覚えておくこと。
print_r($配列名);
例えば、以下のように記述する。
$result[0] = 72;
$result[1] = 82;
print_r($result);
// 出力
[0] => 72
[1] => 82
配列のサイズ変更
PHPでは、配列のサイズを変更する方法は複数存在する。
要素の追加
- 配列代入による方法
完全に新しい配列に置き換える場合は、配列代入を行う。
// 1つずつ定義する場合
// (特定の位置の値を更新しやすい)
$result[0] = 72;
$result[1] = 52;
print_r($result)
$result[2] = 96;
$result[3] = 20;
print_r($result)
// []演算子を使用して配列を再定義する場合
$result = [72, 52];
print_r($result);
$result = [72, 52, 96, 20]; // 配列の再定義 (サイズ変更)
print_r($result);
- array_push関数を使用する方法
これは、末尾に要素を追加するものである。
末尾に要素を追加する場合は、array_push関数や[]演算子を使用する。
$result = [72, 52];
array_push($result, 96, 20); // 最後尾に96と20を追加
// 追加後は、$result = [72, 52, 96, 20] となる
- []演算子を使用する方法
これは、末尾に要素を追加するものである。
末尾に要素を追加する場合は、array_push関数や[]演算子を使用する。
$result = [72, 52];
$result[] = 96; // 96を末尾に追加
$result[] = 20; // 20を末尾に追加
- array_unshift関数を使用する方法
これは、配列の先頭に要素 (要素群) を追加するものである。
$result = [72, 52];
array_unshift($result, 96, 20); // 先頭に96と20を追加
// 追加後は、$result = [96, 20, 72, 52] となる
- array_splice関数を使用する方法
これは、任意の位置に要素 (要素群) を追加するものである。
$result = [72, 52];
array_splice($result, 2, 0, [96, 20]); // 2番目の要素の位置に96と20を追加
// 追加後は、$result = [72, 52, 96, 20] となる
要素の削除
- array_pop関数で要素を削除する方法
これは、末尾の要素を削除する。
$result = [72, 52, 96, 20];
array_pop($result); // 最後尾の要素である20を削除
- array_shift関数で要素を削除する方法
これは、先頭の要素を削除する。
$result = [72, 52, 96, 20];
array_shift($result); // 先頭の要素である72を削除
- unset関数で要素を削除する方法
これは、特定の要素を削除するものである。
unset関数で要素を削除しても、配列のインデックスは自動的には詰められない。
そのため、削除した後に配列のインデックスを振り直す場合は、array_values関数を使用する。
$result = [72, 52, 96, 20];
unset($result[2]); // 2番目の要素である96を削除
- array_splice関数は要素の削除も可能である。
これは、第3引数 (length) に削除する要素数を指定することで実現できる。
この時、第4引数は指定しないこと。
$array = [1, 2, 3, 4, 5];
// 先頭から1つ削除
array_splice($array, 0, 1); // [2, 3, 4, 5]
// 末尾から1つ削除
array_splice($array, -1, 1); // [1, 2, 3, 4]
// 1番目の要素から2つの要素を削除
array_splice($array, 1, 2); // [1, 4, 5]
要素の切り取り
- array_slice関数で要素を切り取り、新たな配列を定義することができる。
$array = [1, 2, 3, 4, 5];
// 1番目の要素から2つ要素を切り取り、新たな配列を定義
// インデックス番号を振りなおす
// array -> [1, 4, 5]
// array2 -> [2, 3]
$array2 = array_slice($array, 1, 2);
// 1番目の要素から2つ要素を切り取り、新たな配列を定義
// インデックス番号を振りなおさず、保持する
// array -> [1, 4, 5]
// array3 -> [2, 3]
$array3 = array_slice($array, 1, 2, true);
配列の結合
$fruits1 = ['apple', 'orange'];
$fruits2 = ['banana', 'grape'];
// スプレッド演算子を使用した配列の結合
// PHP 7.4以降で使用可能
$allFruits = [...$fruits1, ...$fruits2]; // 結果: ['apple', 'orange', 'banana', 'grape']
// array_merge関数を使用した配列の結合
$mergedFruits = array_merge($fruits1, $fruits2); // 結果: ['apple', 'orange', 'banana', 'grape']
配列の再定義
unset関数で要素を削除した場合、配列のインデックスは自動的には詰められない。
そのため、削除した後に配列のインデックスを振り直す場合は、array_values
関数を使用して、配列を再定義する。
// インデックスを振り直す
$fruits = ['apple', 'banana', 'orange'];
unset($fruits[1]);
$fruits = array_values($fruits); // インデックスを振り直す
連想配列
連想配列の定義
連想配列において、要素を作成したり要素から値を取得するには、キーを指定する必要がある。
PHPの連想配列では、キーとして整数 (正の整数、0、負の整数) と文字列を使用することができる。
キーに整数を指定する場合は、正の整数と負の整数を指定することが可能である。
整数を指定する場合、キーは連続した整数である必要はない。
// 直接代入
$array['name'] = 'Yamada';
$array['age'] = 25;
$array['city'] = 'Aichi';
// array関数を使用して定義する場合
$array1 = array(
'name' => 'Yamada',
'age' => 25,
'city' => 'Osaka'
);
// 短縮構文 (PHP 5.4以降)
$array2 = [
'name' => 'Tanaka',
'age' => 30,
'city' => 'Tokyo'
];
// 各要素にアクセスする場合
echo $array['name']; // Yamada
echo $array['age']; // 25
echo $array['city']; // Aichi
※注意
ただし、数値キーを使用する場合は、以下に示すことに注意する。
- キーに小数点を使用する場合、整数に切り捨てられる。
- 例: $var[1.5]は、$var[1]として扱われる。
- キーに文字列の数字を使用する場合、整数に変換される。
- 例: $var["2"]は、$var[2]として扱われる。
また、可読性の高いコードを記述する場合は、意味のある文字列をキーとして使用することを推奨する。
$var['number'] = 14;
$var['city'] = 'Tokyo';
$var['code'] = 8400;
キーに文字列を指定する場合は、シングルクオーテーションまたはダブルクオーテションで括る必要がある。
文字列をクオーテーションで括らずに指定する場合、エラーにはならないが、未定義の定数が指定されたものとして扱われるため、
必ず、クオーテーションで括って指定すること。
$var['yamada'] = 86;
$var["endou"] = 75;
$var['aichi'] = 'nagoya';
なお、キーが整数で構成された文字列の場合、整数のキーが指定されたものとして扱われる。
$var['8'] = 75;
// 以下と同じ意味
$var[8] = 75;
ただし、キーが整数で構成された文字列であっても、以下のような場合は文字列のままである。
$var['08'] = 75; // 文字列08のまま
変数や定数を使ってキーを指定することもできる。
$key = 'peach';
$var[$key] = 120;
define("INDEX_KEY", 8);
$var[INDEX_KEY] = 120;
print_r($var);
// 出力
[peach] => 120
[8] => 120
また、キーとして変数を指定する場合、文字列の中に変数を記述して、変数展開をすることも可能である。
$key = 'peach';
$var["price_$key"] = 120;
print_r($var);
// 出力
[price_peach] => 120
連想配列の要素の存在確認
// 任意の要素の存在確認
if (isset($array1['age'])) {
echo $array1['age'];
}
// デフォルト値の使用
// Nullコアレス演算子 (PHP 7以降)
// キー"city"が存在しない場合は、"Unknown"となる
$city = $array1['city'] ?? 'Unknown';
連想配列の操作
$array1 = [
'name' => 'ウェイ',
'age' => 25,
'country' => 'China'
];
// 要素の追加
$array1['birth'] = '2024/01/01';
// 要素の変更
$array1['name'] = 'ナスティア';
$array1['age'] = '30';
$array1['country'] = 'Russia';
// 要素の削除
unset($array1['age']);
// 要素数の取得
$count = count($array1);
// キーの存在確認
$exists = array_key_exists('name', $array1);
// 値の存在確認
$hasValue = in_array('Jap', $array1);
// キーの取得
$keys = array_keys($array1);
// 値の取得
$values = array_values($array1);
連想配列の走査
連想配列は通常の配列と異なり、全ての値をfor文で値を取得することはできない。
そのため、全ての値を取得する場合は、foreach文を使用して連想配列の値を取得する。
// foreach文のシンタックス
// キーと値の走査
// <任意の変数名 1>にはキー名、<任意の変数名 2>には値が自動的に代入される
foreach (<連想配列名> as <任意の変数名 1> => <任意の変数名 2>) {
// ...処理
}
// 値のみの走査
foreach (<変数名> as <連想配列名>) {
// ...処理
}
// キーと値の走査
foreach ($array1 as $key => $value) {
echo "$key: $value\n";
}
// 値のみの走査
foreach ($array1 as $value) {
echo "$value\n";
}
連想配列の結合
$array1 = [
'name' => 'ウェイ',
'age' => 25
];
$array2 = [
'country' => 'China',
'hobby' => 'Reading'
];
// スプレッド演算子での連想配列の結合
$spread = [...$array1, ...$array2];
// array_merge関数の使用
// 同じキーを持つ要素がある場合、後の配列の値で上書き
// 任意の数の配列を結合可能
// 数値キーは振り直される
$merged = array_merge($array1, $array2);
// +演算子の使用
// ただし、同じキーが存在する場合は、左側が優先される
$combined = $array1 + $array2;
連想配列の並べ替え
ただし、sort関数には連想配列の対応関係を維持しない。
asort
関数やksort
関数等は連想配列にも使用できる。
$array = ["a" => "hoge", "z" => "piyo", "y" => "huga"];
// キーでソート
ksort($array1); // 昇順
krsort($array1); // 降順
// 値でソート
asort($array1); // 昇順
arsort($array1); // 降順
// カスタムソート
uasort($array1, function($a, $b) {
return $a <=> $b; // 宇宙船演算子 (PHP 7以降)
});
関数名 | ソート基準 | キーと値の相関関係 | ソートの順序 |
---|---|---|---|
array_multisort関数 | 値 | 連鎖配列は維持、添字配列は維持しない | 最初の配列、あるいは、ソートオプション |
asort関数 | 値 | 維持する | 昇順 |
arsort関数 | 値 | 維持する | 降順 |
krsort関数 | キー | 維持する | 降順 |
ksort関数 | キー | 維持する | 昇順 |
natcasesort関数 | 値 | 維持する | 大文字・小文字を区別しない自然順 |
natsort関数 | 値 | 維持する | 自然順 |
rsort関数 | 値 | 維持しない | 降順 |
shuffle関数 | 値 | 維持しない | ランダム |
sort関数 | 値 | 維持しない | 昇順 |
uasort関数 | 値 | 維持する | ユーザ定義 |
uksort関数 | キー | 維持する | ユーザ定義 |
usort関数 | 値 | 維持しない | ユーザ定義 |
連想配列の変換
// 連想配列をJSON形式に変換
$json = json_encode($array1);
// JSONを連想配列に戻す
$array = json_decode($json, true);
// 連想配列のフィルタリング
$filtered = array_filter($array1, function($value) {
return $value > 20; // 20より大きい値のみ抽出
});
// 連想配列の要素を変換
$mapped = array_map(function($value) {
return $value * 2; // 各要素を2倍にする
}, $array1);
エラー処理
// 安全なアクセス
$value = isset($array1['key']) ? $array1['key'] : 'default';
// または
$value = $array1['key'] ?? 'default'; // PHP 7以降
// エラー回避
try {
$value = $array1['nonexistent'];
}
catch (Error $e) {
// エラー処理
}
配列の引数展開
引数展開は可変⻑配列とは逆であり、配列を引数に展開することもできる。
function output($a, $b, $c)
{
echo $a . PHP_EOL; // hoge
echo $b . PHP_EOL; // piyo
echo $c . PHP_EOL; // huga
}
// 配列を展開して引数に渡す
$array = ["hoge", "piyo", "huga"];
output(...$array);
キーの自動付与
配列に新しい要素を追加する場合、キーを省略することも可能である。
キーが省略された場合、整数のキーが自動で付与される。
付与される整数のキーは、現在、キーとして割り当てられている最大の整数に1を加えたものである。
整数のキーが1つも存在しない場合は0から付与される。
整数のキーを連続する数値で順に割り当てる場合に便利である。
キーを省略する場合は、以下のように記述する。
以下の例では、最初の要素のキーは0、次の要素のキーは1が付与される。
$var[] = 100;
$var[] = 'Tokyo';
print_r($var);
// 出力
[0] => 100
[1] => Tokyo
以下の例では、整数のキーとして7と12が存在するが最大のキーは12であるため、キーが省略された場合は13が付与される。
$var[12] = 100;
$var['Kudou'] = 72;
$var[7] = 100;
$var[] = 'Tokyo';
print_r($var);
// 出力
[12] => 100
[Kudou] => 72
[7] => 100
[13] => Tokyo
文字列のキーが存在する場合でも、自動的に付与されるキーには何も影響しない。
また、負の整数のキーのみ存在する場合、自動的に付与されるキーは0となる。
$var[-3] = 75;
$var[-12] = 45;
$var[] = 28;
$var[] = 83;
print_r($var);
// 出力
[-3] => 75
[-12] => 45
[0] => 28
[1] => 83
配列の初期化 : array()
配列に追加する要素をまとめて指定して初期化するには、array
を使用する。
array
を使用することで、配列に格納する要素の初期化を簡潔に記述することができる。
引数に指定されたキーと値により、初期化された配列を返す。
array
は関数のように使用されるが、厳密には関数ではなくPHPの言語構造の1つである。
array array ([ mixed $... ] )
要素が空の配列を定義する場合は、引数を指定せずにarray
を実行する。
$var = array();
要素を指定して配列を定義する場合は、以下のように引数を指定する。
$var = array('キー1' => 値1, 'キー2' => 値2, ...);
各要素に対して、キーと値をペアで指定する。
複数の要素を追加する場合は、カンマ,
で区切って記述する。
$var = array('Tokyo' => '東京', 'Osaka' => '大阪', 'Fukuoka' => '福岡');
また、キーを自動付与する場合は、array
の引数に値のみを記述する。
$var = array(値1, 値2, ...);
キーを指定する要素とキーを省略する要素を混在して引数に指定することも可能である。
$var = array(10 => '遠藤', '斉藤', '伊藤');
多次元配列
要素の値は、どのような値でも格納することができる。
そのため、数値や文字列に加えて、他の配列を格納することも可能である。
以下の例では、配列makerと配列typeをそれぞれ作成した後、この2つの配列を値とした要素を持つ2次元配列pcを作成している。
要素の値として格納した配列の要素に他の配列も格納できるため、多次元配列も作成できる。
$maker = array('富士通', 'NEC', 'Sony', 'Sharp');
$type = array('Note', 'Desktop');
$pc = array($maker, $type);
また、以下のように記述しても同様の2次元配列を作成できる。
$maker = array('富士通', 'NEC', 'Sony', 'Sharp');
$type = array('Note', 'Desktop');
$pc[0] = $maker;
$pc[1] = $type;
多次元配列において、キーを指定して要素を指定する場合、要素に含まれる配列を取得できる。
2次元配列では、値として含まれる配列の中のさらに要素を指定する場合は、以下のように記述する。
まず、配列に値として格納されている配列を変数に格納する。
次に、取得した配列に対して、キーを指定して値を取得する。
$変数1 = $配列名[キー]; $変数2 = $変数1[値として格納された配列のキー];
上記の記述方法でも構わないが、一般的に、以下のようにまとめて記述する。
$変数 = $配列変数名[キー][値として格納された配列のキー];
$maker = array('富士通', 'NEC', 'Sony', 'Sharp');
$type = array('Note', 'Desktop');
$pc = array($maker, $type);
print $pc[0][1]; // NEC と出力
print $pc[1][0]; // Note と出力
※注意
なお、配列Aを配列Bの値として格納する場合、配列Aが持つ要素がコピーされて配列Bの値として格納される。
そのため、後から元になった配列Aの要素を変更しても配列Bの要素には影響しない。