この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: キーと値の取得
SEOタイトル: PHP 連想配列 キーと値の取得完全ガイド (array_keys/array_values/foreach)

この記事の要点
  • array_keys($arr) でキー配列、array_values($arr) で値配列
  • foreach ($arr as $key => $value) がもっとも基本的・直感的
  • キー存在確認は array_key_exists() / isset() (null は isset で false)
  • array_flip() でキーと値を入替、array_combine() で 2 配列から連想配列を構築
  • Java Map / JS Map / Python dict と概念は同じ

基本: 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']

キー存在チェック

キーの状態issetarray_key_exists!empty
未定義キーfalsefalsefalse
値 = nullfalsetruefalse
値 = '' (空文字)truetruefalse
値 = 0truetruefalse
値 = '値'truetruetrue
$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 HashMapJS 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) なので注意。