【PHP】 配列や連想配列の宣言と、関連する便利な関数を知ろう

PHPにおける配列と連想配列は実質同じ存在です。例えばarray_maparray_filterなどは、連想配列でも利用できます。また、is_arrayは連想配列でもtrueになります。

このようにPHPでは配列と連想配列が実質同じであるため、まとめて確認していきましょう。

配列を作る

普通の配列

配列は[1, 2, 3]のようにして作成します。使うときは$ary[1]のように書きます。

$ary = [10, 2, 300];

for ($i = 0; $i < count($ary); $i++) {
    // ...
}

print($ary[1]); // 2を出力

多次元配列の場合は、普通に配列の中に配列を入れるだけです。

// 1列に書いた場合
$ary = [1, 2, [10, [200, 300, 400], 30], 3, 4, 5,];

// 改行した場合
$ary = [
    1,
    2,
    [
        10,
        [200, 300, 400],
        30
    ],
    3,
    4,
    5,
];

配列の最後の要素につけるカンマをケツカンマと呼びます。

連想配列

連想配列では、[key => value, key => value]のように、keyに対応する値を=>でつなぎます。値は$dict['hoge']のようにして取得や代入ができます。

PHPの連想配列は、キーの順序が保持されます

$dict = ['hoge' => 100, 'fuga' => 200, 5 => 300];

$dict['fuga'] = 'aaa'; // 代入

print($dict['hoge']);
print($dict['fuga']);
result
100aaa
変数の値を使う場合
$a = 'hoge';
$b = 'fuga';
$c = 'hige';
$dict = [$a => 'aaa', $b => $c];

foreach ($dict as $k => $v) {
    print("$k: $v\n");
}
result
hoge: aaa
fuga: hige

Javascriptのように$dic->fugaのようにはできません。

PHPにおける配列というのは、keyが連番である連想配列という扱いです。実際、連想配列を作る際にキーを指定しなかった場合、自動的に配列のインデックスが割り当てられます。

インデックスは0から始まり、途中でkeyが数値のものがあった場合、インデックスはそこから再開します。

$dict = [
    'hoge' => 100,
    200,
    30,
    100 => 'hoge',
    40,
    50,
];

foreach ($dict as $key => $value) {
    print("$key: $value\n");
}
result
hoge: 100
0: 200
1: 30
100: hoge
101: 40
102: 50

配列の操作

配列の要素の追加や削除などを行う機能です。ここではよく利用するであろうものを紹介します。

要素数の取得 (count)

count(配列)で要素数を取得できます。連想配列でも同様に取得できます。

$ary = [1, 2, 'hoge' => 100];
print(count($ary));
result
3

要素の追加 (push)

array_push(追加先配列, ...追加する値)で追加します。追加する値は何個でも追加できます。

...argは可変長引数を表します。これは、1個以上の任意の数の引数を取れるという意味です。

$ary = [5, 10, 15];
array_push($ary, 100, 200, 300);
print(implode(', ', $ary));
result
5, 10, 15, 100, 200, 300

存在しないキーを使用して直接代入することでも追加できます。

$ary[count($ary)] = 100;や、$ary['hoge'] = 100;のようにします。

要素の削除 (unset)

要素の削除には、変数の削除などでも利用するようなunsetを使用します。

$ary = [5, 10, 15, 20];
unset($ary[2]);
print(implode(', ', $ary));
result
5, 10, 20

配列を文字列に連結 (implode)

すでに出てきていますが、implode(連結文字, 配列)を使用すると、配列の各要素を特定の文字で連結できます。

昔はimplode(配列, 連結文字)のように逆でも使用できましたが、PHP8.0で使用できなくなりました。

$ary = [5, 10, 15];
$s1 = implode(', ', $ary);
$s2 = implode("\n-------\n", $ary);

print("$s1\n\n");
print("$s2\n");
result
5, 10, 15

5
-------
10
-------
15

配列のキーを取得 (array_keys)

配列のキーを配列で取得します。主に連想配列用です。

$dict = ['hoge' => 100, 'fuga' => 200, 300, 400, 100 => 'aaa'];
$keys = array_keys($dict);
print(implode(', ', $keys));
result
hoge, fuga, 0, 1, 100

配列の値だけ取得する (array_values)

この機能は、配列の値だけを取りたいというよりも、配列のインデックスを振り直したいときに利用することが多いです。

$ary = ['hoge' => 100, 'fuga' => 500, 8, 3, 3];
$values = array_values($ary);
print(implode(', ', $values));
result
100, 500, 8, 3, 3

次のようなパターンで、インデックスを振り直したいときに使えます。

$ary = [1, 2, 3, 4, 5];
// 値が奇数の要素だけ取り出し
$ary2 = array_filter($ary, fn($v) => $v % 2);

// インデックスを振り直さない場合
foreach ($ary2 as $i => $v) {
    print("$i: $v\n");
}

print("\n");

// インデックス振り直し
$ary2 = array_values($ary2);
foreach ($ary2 as $i => $v) {
    print("$i: $v\n");
}
result
0: 1
2: 3
4: 5

0: 1
1: 3
2: 5

配列を結合 (array_merge)

複数の配列を1つに連結したい場合はarray_merge(...配列)を使用します。

キーが数値の場合は、連番が振られ直します。数値以外の場合はキーがそのまま残りますが、キーが重複したら後のほうが優先されます。

$ary1 = [10, 20, 30, 'foo' => 'bar', 100 => 'aaa'];
$ary2 = [1 => 'hoge', 'fuga', 'foo' => 'hige', 100 => 'bbb'];

// 1や100、"foo"などのインデックスが重複している
$merged = array_merge($ary1, $ary2);

foreach ($merged as $k => $v) {
    print("$k: $v\n");
}
result
0: 10
1: 20
2: 30
foo: hige
3: aaa
4: hoge
5: fuga
6: bbb

普通の配列同士を連結するだけなら、インデックスの振り直しなどを気にする必要はありません。

+でもマージできます。array_mergeとの違いは、インデックスが振り直されず、左辺の値が優先されるということです。つまり、+は連想配列向きです。

[30, 50, 100] + [1, 2, 3, 4, 5][30, 50, 100, 4, 5]になります。

ソート

配列のソートは複数用意されています。https://www.php.net/manual/ja/array.sorting.php

特によく使用するのはsortasortksortusortあたりです。rsortarsortkrsortといった降順ソートも使用します。

重要なこととして、これらのソートは元の配列を書き換えるものであるということです。

sort
$ary1 = [1, 'aaa', 'AAA', 'abc', 6, 3, 'ABC'];

/**
 * sortは、キーと値の関係を維持せずにソートするものです。普通の配列向けです。
 *
 * 第2引数は比較方法です。指定なしなら普通の比較関数になります。
 * そのため、数値と文字を比較すると数値が文字扱いされるなど、注意が必要な場合があります。
 *  SORT_REGULAR: 普通の比較 (デフォルト)
 *  SORT_NUMERIC: 数値として比較します
 *  SORT_STRING: 文字として比較します
 *  SORT_LOCALE_STRING: ロケールを考慮して、文字として比較します
 *  SORT_NATURAL: 自然順でソート。例えば、hoge123よりhoge1111が後ろという判定になります。つまり、"hoge"の123番目と1111番目で比較、というイメージです。
 *                最近のWindowsのファイルやフォルダの並び順はこれです。
 *  SORT_FLAG_CASE: 大文字小文字を同一扱いします。SORT_FLAG_CASE | SORT_STRING のようにbit orで指定します。
 */
sort($ary1, SORT_FLAG_CASE | SORT_STRING);

// デフォルト設定なら、実引数は1つで良い
// array_multisort($ary1);

foreach ($ary1 as $k => $v) {
    print("$k: $v\n");
}
result
0: 1
1: 3
2: 6
3: aaa
4: AAA
5: abc
6: ABC
asort
$ary1 = ['hoge' => 1, 'fuga' => 'aaa', 'foo' => 'abc', 5 => 10, 1 => 100];

/**
 * asortは、キーと値の関係を維持して、値でソートするものです。連想配列向けです。
 *
 * 第2引数は比較方法です。指定なしなら普通の比較関数になります。
 */
asort($ary1);
// asort($ary1, SORT_STRING);

foreach ($ary1 as $k => $v) {
    print("$k: $v\n");
}
result
hoge: 1
5: 10
1: 100
fuga: aaa
foo: abc
ksort
$ary1 = ['hoge' => 1, 'fuga' => 'aaa', 'foo' => 'abc', 5 => 10, 1 => 100];

/**
 * ksortは、キーと値の関係を維持して、キーでソートするものです。連想配列向けです。
 *
 * 第2引数は比較方法です。指定なしなら普通の比較関数になります。
 */
ksort($ary1, SORT_STRING);

foreach ($ary1 as $k => $v) {
    print("$k: $v\n");
}
result
1: 100
5: 10
foo: abc
fuga: aaa
hoge: 1
usort
$ary1 = [5, 3, -1, -3, 20, -100, 5, 10];

/**
 * usortは、キーと値の関係を維持せずに、ユーザが指定した基準で、値でソートするものです。
 * uksortはキーでソート、uasortはキーと値の関係を維持してソートします。
 *
 * 第2引数は比較用関数を入れます。ここに、どのような基準で大小を決めるかを書きます。
 */
usort($ary1, function ($lhs, $rhs) {
    // 例えば絶対値にして比較する場合
    $lhs = abs($lhs);
    $rhs = abs($rhs);

    if ($lhs === $rhs) {
        // 等しい判定なら0を返す
        return 0;
    }
    
    // 左辺が大きければ1、小さければ-1を返す。
    // 正負を逆にすれば逆順のソートになる
    return ($lhs < $rhs) ? -1: 1;
});

foreach ($ary1 as $k => $v) {
    print("$k: $v\n");
}
result
0: -1
1: 3
2: -3
3: 5
4: 5
5: 10
6: 20
7: -100

その他の関数

他にも様々な関数があります。使用頻度は低いですが、forやforeachを利用するよりスマートに書くことができるかもしれません。公式サイトから探してみてください。

https://www.php.net/manual/ja/ref.array.php

配列を全件スキャンする関数

下の記事を確認してください。

まとめ

PHPの配列は、[1, 5, 2, 100]のようにして作成します。連想配列では[key => value]のように書きます。

配列を操作するための関数は数多くあるので、使いこなせればバグの少ない、スマートなコードを書くことができます。

php array thumb

役に立ったらシェアしよう!