PHP - 配列

公開日:2020-12-22 更新日:2020-12-22
[PHP]

1. 概要

配列を使うと、1つの変数で、複数の値を保持することができます。主に、同じ種類の値を複数保持する際に使用します。
各値は、変数名の後ろに角括弧 [ ] を付け、[ ] の中に 0 から始まるインデックスと言う連番を指定すると参照できます。
変数[インデックス] = 値; //代入

var_dump( 変数[インデックス] ); //取得

配列を生成するには、array( ) または [ ] を使います。
変数 = array(値, 値, 値, 値, ...);

または

変数 = [値, 値, 値, 値, ...];

2. 使用例

次の例では、複数の名前を、配列に入れて、各要素を取得しています。

$names = ['ichiro', 'jiro', 'saburo', 'shiro'];

var_dump( $names[0] );
var_dump( $names[1] );
var_dump( $names[2] );
var_dump( $names[3] );
実行結果
string(6) "ichiro"
string(4) "jiro"
string(6) "saburo"
string(5) "shiro"

3. 配列の要素数の取得

配列の要素数は、count( ) で取得できます。
$names = ['ichiro', 'jiro', 'saburo', 'shiro'];

var_dump( count($names) );
実行結果
int(4)

4. 変数によるインデックスの指定

[ ] のインデックスは、変数で指定することもできます。
$names = ['ichiro', 'jiro', 'saburo', 'shiro'];
$idx = 3;
var_dump( $names[$idx] );
実行結果
string(5) "shiro"

5. ループによる全要素の取得

for とあわせて使うと、配列の全ての要素を簡単に参照することができます。
要素数が増減しても、処理を変える必要はありません。
$names = ['ichiro', 'jiro', 'saburo', 'shiro'];

for ($i = 0; $i < count($names); $i++) {
    var_dump( $names[$i] );
}
実行結果
string(6) "ichiro"
string(4) "jiro"
string(6) "saburo"
string(5) "shiro"

また、for の代わりに foreach を使うと、簡単に参照することができます。
次の例は上の例と同じ結果になります。
$names = ['ichiro', 'jiro', 'saburo', 'shiro'];

foreach ($names as $name) {
    var_dump( $name );
}

6. 要素の追加

インデックスを指定せずに [ ] だけにして代入すると、配列の最後に要素が追加されます。
$names = []; 
$names[] = 'ichiro';
$names[] = 'jiro';
$names[] = 'saburo';

var_dump( $names );
実行結果
array(3) {
  [0]=>
  string(6) "ichiro"
  [1]=>
  string(4) "jiro"
  [2]=>
  string(6) "saburo"
}

7. 要素の削除

配列の要素を削除するには、unset( ) を使います。
引数には、削除する要素を指定します。
$ary = ['a', 'b', 'c', 'd', 'e'];
unset($ary[2]);
var_dump($ary);
実行結果
array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}

unset( ) で削除した場合、削除したインデックスは空き番になります。
上記の場合、[2] が抜けています。
インデックスを詰めたい場合は、array_values( ) で、インデックスを詰めた配列を取得できます。
但し、空き番があっても、foreach などで各要素に参照することはできるため、
本当にインデックスを詰める必要があるか検討してください。
$ary = ['a', 'b', 'c', 'd', 'e'];
unset($ary[2]);
$ary = array_values($ary);
var_dump($ary);
実行結果
array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "d"
  [3]=>
  string(1) "e"
}

8. 先頭の要素の取得と削除

array_shift( ) を使うと、配列の先頭の要素の取得と、その要素の削除をすることができます。
配列を、先入れ先出しのキュー構造として使えます。
$names = ['ichiro', 'jiro', 'saburo'];
$name = array_shift($names);
var_dump( $names );
var_dump( $name );
実行結果
array(2) {
  [0]=>
  string(4) "jiro"
  [1]=>
  string(6) "saburo"
}
string(6) "ichiro"

9. 最後の要素の取得と削除

array_pop( ) を使うと、配列の最後の要素の取得と、その要素の削除をすることができます。
配列を、後入れ先出しのスタック構造として使えます。
$names = ['ichiro', 'jiro', 'saburo'];
$name = array_pop($names);
var_dump( $names );
var_dump( $name );
実行結果
array(2) {
  [0]=>
  string(6) "ichiro"
  [1]=>
  string(4) "jiro"
}
string(6) "saburo"

10. 配列の先頭に要素の追加

array_unshift( ) で、配列の先頭を要素を追加できます。
1番目の引数には配列を指定して、2番目以降に、追加したい要素を複数指定できます。
$names = ['ichiro', 'jiro', 'saburo'];
array_unshift($names, 'test1', 'test2', 'test3');
var_dump( $names );
実行結果
array(6) {
  [0]=>
  string(5) "test1"
  [1]=>
  string(5) "test2"
  [2]=>
  string(5) "test3"
  [3]=>
  string(6) "ichiro"
  [4]=>
  string(4) "jiro"
  [5]=>
  string(6) "saburo"
}

10. 配列の最後に要素の追加

array_push( ) で、配列の先頭を要素を追加できます。
1番目の引数には配列を指定して、2番目以降に、追加したい要素を複数指定できます。
$names = ['ichiro', 'jiro', 'saburo'];
array_push($names, 'test1', 'test2', 'test3');
var_dump( $names );
実行結果
array(6) {
  [0]=>
  string(6) "ichiro"
  [1]=>
  string(4) "jiro"
  [2]=>
  string(6) "saburo"
  [3]=>
  string(5) "test1"
  [4]=>
  string(5) "test2"
  [5]=>
  string(5) "test3"
}

次のようにしても配列の最後に要素を追加できるため、
通常はこちらの書き方で書くことが多いと思います。
$names[] = 'test1';
$names[] = 'test2';
$names[] = 'test3';
配列をスタック構造として使う場合は、あえて array_push( ) を使うのも良いかもしれません。


11. 要素の置換(挿入、削除)

array_splice( ) を使うと、配列の一部分を、他の要素に置換できます。
処理としては、指定された範囲の要素を削除して、その場所に要素を挿入しています。
これを利用すると、置換だけでなく、要素の挿入や削除も行えます。

array_splice(配列, 置換元の位置, 個数, 置換する要素);

置換。インデックス 2 以降の 3 つの要素を、'c', 'd' に置換します。
$ary = ['a', 'b', '_', '_', '_', 'e'];
array_splice($ary, 2, 3, ['c', 'd']);

var_dump($ary);
実行結果
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}

挿入。3番目の引数(置換する個数)を 0 にします。
$ary = ['a', 'b', 'e'];
array_splice($ary, 2, 0, ['c', 'd']);

var_dump($ary);
実行結果
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}

削除。4番目の引数(置換後の要素)を未指定にします。
$ary = ['a', 'b', '_', '_', '_', 'c'];
array_splice($ary, 2, 3);

var_dump($ary);
実行結果
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}

12. 要素の検索

$ary = ['a', 'b', 'c', 'd', 'e'];
$idx = array_search('c', $ary);

var_dump($idx);
var_dump($ary[$idx]);
##/e## 実行結果
int(2)
string(1) "c"

注意事項
要素が見つからなかった場合、false を返します。
false は 0 としても扱われるため、次の例の最初の if は true となります。
見つからない可能性がある場合は、=== で判定するようにしてください。
$ary = ['a', 'b', 'c', 'd', 'e'];
$idx = array_search('xxx', $ary);

var_dump($idx);

//間違った判定方法($idx が false の時も true になる)
if ($idx >= 0) {
  print("見つかりました。\n");
  var_dump($ary[$idx]);
}

//正しい判定方法
if ($idx === false) {
  print("見つかりませんでした。\n");
}
実行結果
bool(false)
見つかりました。
string(1) "a"
見つかりませんでした。

13. その他

要素の有無
$ary = ['a', 'b', 'c', 'd', 'e'];
if (in_array('c', $ary)) {
    print("あるよ");
}
実行結果
あるよ

配列のソート
$ary = ['e', 'd', 'c', 'b', 'a'];
sort($ary);
var_dump($ary);
実行結果
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}

配列の一部分の取得
$ary = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
$ary2 = array_slice($ary, 2, 3);
var_dump($ary2);
実行結果
array(3) {
  [0]=>
  string(1) "c"
  [1]=>
  string(1) "d"
  [2]=>
  string(1) "e"
}

配列のマージ(結合)
$ary1 と $ary2 は元のままです。
$ary1 = ['a', 'b', 'c']; 
$ary2 = ['d', 'e', 'f'];
$ary3 = array_merge($ary1, $ary2);
var_dump($ary3);
実行結果
array(6) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "f"
}