タイトル: キーと値の取得
SEOタイトル: PHP 連想配列 キーと値の取得完全ガイド (array_keys/array_values/foreach)
| この記事の要点 |
|
基本: foreach での走査
$user = [
'name' => 'Taro',
'age' => 30,
'email' => 'taro@example.com',
];
// キーと値を同時取得
foreach ($user as $key => $value) {
echo "$key: $value\n";
}
// name: Taro
// age: 30
// email: taro@example.com
// 値だけでよい
foreach ($user as $value) {
echo $value;
}
// 参照渡しで変更
foreach ($user as $key => &$value) {
$value = is_string($value) ? strtoupper($value) : $value;
}
unset($value); // ★ 参照解除を忘れずに
array_keys() / array_values()
$user = ['name' => 'Taro', 'age' => 30, 'role' => 'admin'];
// キーを配列で取得
$keys = array_keys($user);
// ['name', 'age', 'role']
// 値を配列で取得
$values = array_values($user);
// ['Taro', 30, 'admin']
// 特定の値に対応するキーを取得
$keys = array_keys($user, 'Taro'); // ['name']
$keys = array_keys($user, 30, true); // 厳密比較 ['age']
// 第三引数 true で型まで一致
array_keys(['0' => 'a', 0 => 'b'], 0); // [0]
array_keys(['0' => 'a', 0 => 'b'], '0', true); // ['0']
キー存在チェック
| キーの状態 | isset | array_key_exists | !empty |
|---|---|---|---|
| 未定義キー | false | false | false |
| 値 = null | false | true | false |
| 値 = '' (空文字) | true | true | false |
| 値 = 0 | true | true | false |
| 値 = '値' | true | true | true |
$arr = ['a' => 1, 'b' => null];
// null と未定義を区別したいときは array_key_exists
isset($arr['b']); // false (null だから)
array_key_exists('b', $arr); // true
// 短い記法 (Null Coalescing)
$value = $arr['c'] ?? 'default'; // 未定義 / null は 'default'
// ?? 演算子 (Laravel 等)
$role = $user['role'] ?? 'user';
array_combine / array_flip
// 2 つの配列から連想配列を構築
$keys = ['name', 'age', 'role'];
$values = ['Taro', 30, 'admin'];
$user = array_combine($keys, $values);
// ['name' => 'Taro', 'age' => 30, 'role' => 'admin']
// キーと値を入替
$user = ['a' => 1, 'b' => 2, 'c' => 3];
$flipped = array_flip($user);
// [1 => 'a', 2 => 'b', 3 => 'c']
// 値の重複があると後勝ち
$dup = ['a' => 1, 'b' => 1, 'c' => 2];
array_flip($dup); // [1 => 'b', 2 => 'c']
条件で抽出: array_filter / array_map
$users = [
'a' => ['name' => 'Taro', 'age' => 30],
'b' => ['name' => 'Hanako', 'age' => 25],
'c' => ['name' => 'Jiro', 'age' => 40],
];
// 値で絞り込み
$over30 = array_filter($users, fn($u) => $u['age'] >= 30);
// ['a' => [...], 'c' => [...]]
// キーで絞り込み (ARRAY_FILTER_USE_KEY)
$abOnly = array_filter($users, fn($k) => in_array($k, ['a', 'b']), ARRAY_FILTER_USE_KEY);
// キーと値両方使う
$picked = array_filter($users, fn($v, $k) => $k !== 'b' && $v['age'] > 20, ARRAY_FILTER_USE_BOTH);
// map: 名前だけ取り出す
$names = array_map(fn($u) => $u['name'], $users);
// ['a' => 'Taro', 'b' => 'Hanako', 'c' => 'Jiro']
// PHP 8.1 First-class Callable Syntax
$ids = array_map(strtoupper(...), ['a', 'b', 'c']);
連想配列を JSON に
$user = ['name' => 'Taro', 'age' => 30];
// JSON 化 (UTF-8 / pretty)
$json = json_encode($user, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// {
// "name": "Taro",
// "age": 30
// }
// JSON → 連想配列 (第二引数 true)
$arr = json_decode('{"name":"Taro","age":30}', true);
echo $arr['name']; // Taro
// false なら object に
$obj = json_decode('{"name":"Taro"}');
echo $obj->name; // Taro
Java / JS Map との比較
| 操作 | PHP 連想配列 | Java HashMap | JS Map |
|---|---|---|---|
| 取得 | $a['k'] | m.get("k") | m.get("k") |
| キー一覧 | array_keys() | m.keySet() | [...m.keys()] |
| 値一覧 | array_values() | m.values() | [...m.values()] |
| 存在確認 | array_key_exists() | m.containsKey() | m.has() |
| ループ | foreach ($m as $k => $v) | m.forEach((k,v) -> ...) | for (const [k,v] of m) |
Laravel Collection との連携
use Illuminate\Support\Collection;
$users = collect([
['name' => 'Taro', 'age' => 30],
['name' => 'Hanako', 'age' => 25],
]);
$users->pluck('name'); // Collection['Taro', 'Hanako']
$users->pluck('age', 'name'); // ['Taro' => 30, 'Hanako' => 25]
$users->keys();
$users->values();
$users->filter(fn($u) => $u['age'] >= 30);
$users->toArray();
FAQ
Q: 配列のキーが数値と文字列が混在しても OK?
A: OK。['a' => 1, 0 => 'x', 'b' => 2] のような構造も許容されますが、数値文字列 '0' は int 0 に変換される点に注意。
Q: 連想配列の順序は保たれる?
A: PHP は挿入順を保つのが言語仕様(C 実装の hash + linked list)。Java HashMap と違って順序が安定です。
Q: 巨大な連想配列の検索は遅い?
A: PHP の配列はハッシュテーブルなので isset($arr[$key]) は平均 O(1)。in_array() は O(n) なので注意。