PHP - 連想配列

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

1. 概要

配列は [ ] の中にインデックスを指定して要素を特定しましたが、
連想配列では、インデックスの代わりに任意の文字列(キー)を使います。

ちなみに、Java では Map、C# では Dictionary と呼ばれています。

2. 基本

[ ] または array() で連想配列を生成する時は、「キー => 値」で要素を指定します。
あとは、要素の指定がインデックス(数値)からキー(文字列)に変わるだけで、配列と同様に扱うことができます。

//連想配列の生成
$map = [
  'id'    => 123,
  'name'  => 'taro',
  'addr1' => 'tokyo'
];
//追加 または 上書き
$map['addr2'] = 'chiyoda';

//取得
var_dump($map['name']);

var_dump($map);
実行結果
string(4) "taro"
array(4) {
  ["id"]=>
  int(123)
  ["name"]=>
  string(4) "taro"
  ["addr1"]=>
  string(5) "tokyo"
  ["addr2"]=>
  string(7) "chiyoda"
}

要素を削除する場合は、unset() を使います。
$map = [
    'id'    => 123,
    'name'  => 'taro',
    'addr1' => 'tokyo'
];

unset($map['name']);
var_dump($map);
実行結果
array(2) {
  ["id"]=>
  int(123)
  ["addr1"]=>
  string(5) "tokyo"
}

3. ループして各要素を取得

要素を1つずつ取得するには、foreach を使います。
$map = [
    'id'    => 123,
    'name'  => 'taro',
    'addr1' => 'tokyo'
];

foreach ($map as $value) {
    print($value . "\n");
}
実行結果
123
taro
tokyo

値と一緒にキーを取得したい場合は、as と => を使います。
$map = [
    'id'    => 123,
    'name'  => 'taro',
    'addr1' => 'tokyo'
];

foreach ($map as $key => $value) {
    print("['" . $key . "'] = " . $map[$key] . "\n");
}
実行結果
['id'] = 123
['name'] = taro
['addr1'] = tokyo

4. キー一覧の取得

$map = [
    'id'    => 123,
    'name'  => 'taro',
    'addr1' => 'tokyo'
];

$keys = array_keys($map);

foreach ($keys as $key) {
    print($map[$key] . "\n");
}
実行結果
123
taro
tokyo

5. 連想配列の配列

連想配列をさらに配列することもできます。
また、array_column() を使うと、指定した項目だけ取得することができます。
$members = [
  [ 'id' => 1, 'name' => 'taro' ],
  [ 'id' => 2, 'name' => 'hanako' ],
  [ 'id' => 3, 'name' => 'ichiro' ]
];

$names = array_column($members, 'name');

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

連想配列の配列は、次のようにしても同じように生成できます。
$members = [];
$members[] = ['id' => 1, 'name' => 'taro' ];
$members[] = ['id' => 2, 'name' => 'hanako'];
$members[] = ['id' => 3, 'name' => 'ichiro'];
プログラム作成時に値が決まっていることは稀なので、
連想配列を1件ずつ追加することの方が多いです。