PHPのforeachでkeyとvalueを取得する方法について

採用はこちら

PHPのforeachは、配列や反復可能なオブジェクトの要素を順番に処理するときに使用する構文です。

配列を扱う際は、値だけでなく「キー(key)」と「値(value)」を同時に取得できます。

基本的な書き方は次のとおりです。

foreach ($array as $key => $value) {
    // $keyにはキーが入る
    // $valueには値が入る
}

=>の左側がキー、右側が値です。

たとえば、次のような連想配列があるとします。

$user = [
    'name' => '田中',
    'age' => 30,
    'city' => '東京'
];

foreach ($user as $key => $value) {
    echo $key . ': ' . $value . PHP_EOL;
}

実行結果は次のようになります。

name: 田中
age: 30
city: 東京

この場合、$keyにはnameagecityが入り、$valueにはそれぞれの値が入ります。

目次

foreachの基本的な書き方

valueだけを取得する方法

キーが必要なく、値だけを処理したい場合は、次のように記述します。

$colors = ['red', 'blue', 'green'];

foreach ($colors as $value) {
    echo $value . PHP_EOL;
}

実行結果は次のとおりです。

red
blue
green

この書き方では、各要素の値だけを$valueで受け取ります。

配列のキーを処理に使用しない場合は、この形式がシンプルです。

keyとvalueを両方取得する方法

キーと値を同時に取得したい場合は、次の形式を使用します。

foreach ($array as $key => $value) {
    // 処理
}

たとえば、次のような連想配列を処理できます。

$fruits = [
    'apple' => 'りんご',
    'banana' => 'バナナ',
    'orange' => 'オレンジ'
];

foreach ($fruits as $key => $value) {
    echo "key: {$key}, value: {$value}" . PHP_EOL;
}

実行結果は次のようになります。

key: apple, value: りんご
key: banana, value: バナナ
key: orange, value: オレンジ

連想配列の項目名と値をセットで処理するときに便利な書き方です。

数値添字配列でkeyとvalueを取得する方法

配列のインデックスを取得する

一般的な数値添字配列でも、foreachを使ってキーと値を取得できます。

$items = ['PHP', 'JavaScript', 'Python'];

foreach ($items as $key => $value) {
    echo "{$key}: {$value}" . PHP_EOL;
}

実行結果は次のとおりです。

0: PHP
1: JavaScript
2: Python

この例では、$key012が入ります。

ただし、PHPの配列キーは必ずしも0から連続するとは限りません。

たとえば、次のような配列も作成できます。

$items = [
    10 => 'PHP',
    20 => 'JavaScript',
    30 => 'Python'
];

foreach ($items as $key => $value) {
    echo "{$key}: {$value}" . PHP_EOL;
}

実行結果は次のようになります。

10: PHP
20: JavaScript
30: Python

foreachで取得できる$keyは単純なループ回数ではなく、実際に配列に設定されているキーです。

連想配列でkeyとvalueを取得する方法

商品情報をforeachで取得する例

Webアプリケーションでは、商品情報やユーザー情報などを連想配列として扱う場面があります。

たとえば、次のような商品情報があるとします。

$product = [
    'name' => 'ノートパソコン',
    'price' => 120000,
    'stock' => 15
];

foreach ($product as $key => $value) {
    echo "{$key}: {$value}" . PHP_EOL;
}

このように記述すると、商品名、価格、在庫数といった項目名と値を順番に取得できます。

HTMLに表示するときはエスケープする

取得した値をHTMLとして表示する場合は、外部入力を含む可能性を考慮し、htmlspecialchars()などでエスケープすることが重要です。

$product = [
    'name' => 'ノートパソコン',
    'price' => 120000,
    'stock' => 15
];

foreach ($product as $key => $value) {
    echo '<p>';
    echo htmlspecialchars((string) $key, ENT_QUOTES, 'UTF-8');
    echo ': ';
    echo htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
    echo '</p>';
}

特にユーザーが入力した文字列をWebページへ表示する場合は、XSS対策を意識しましょう。

多次元配列でkeyとvalueを取得する方法

foreachを入れ子にして処理する

複数のユーザー情報などをまとめた多次元配列では、foreachを入れ子にして処理できます。

$users = [
    [
        'name' => '田中',
        'age' => 30
    ],
    [
        'name' => '佐藤',
        'age' => 25
    ]
];

foreach ($users as $index => $user) {
    echo "ユーザー番号: {$index}" . PHP_EOL;

    foreach ($user as $key => $value) {
        echo "{$key}: {$value}" . PHP_EOL;
    }
}

実行結果は次のようになります。

ユーザー番号: 0
name: 田中
age: 30
ユーザー番号: 1
name: 佐藤
age: 25

外側のforeachではユーザーごとの配列を取得し、内側のforeachでは各ユーザーの項目名と値を取得しています。

foreachで配列のvalueを書き換える方法

通常のforeachでは$valueへの代入で元の要素は変更されない

通常のforeachでは、取得した$valueに別の値を代入しても、基本的に元の配列要素は変更されません。

$numbers = [1, 2, 3];

foreach ($numbers as $value) {
    $value *= 10;
}

print_r($numbers);

実行結果は次のとおりです。

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

$valueを変更しても、元の$numbersには反映されていません。

参照を使って元の配列を変更する

元の配列要素そのものを書き換えたい場合は、&を付けて参照として取得できます。

$numbers = [1, 2, 3];

foreach ($numbers as &$value) {
    $value *= 10;
}

unset($value);

print_r($numbers);

実行結果は次のようになります。

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
)

&$valueとすることで、$valueが配列要素を参照するため、変更内容が元の配列にも反映されます。

参照付きforeachの後はunsetする

参照付きのforeachを使用する場合は、ループ終了後に次のように記述しておくことが重要です。

unset($value);

foreachが終了しても、$valueには最後の配列要素への参照が残ります。

その状態で同じ変数を再利用すると、意図せず最後の配列要素を書き換えてしまう可能性があります。

そのため、参照付きforeachの後ではunset()で参照を解除する習慣を付けると安全です。

keyを利用して元の配列を書き換える方法

参照を使わずに値を変更する

参照を使用せず、取得したキーを利用して元の配列を書き換えることもできます。

$numbers = [1, 2, 3];

foreach ($numbers as $key => $value) {
    $numbers[$key] = $value * 10;
}

print_r($numbers);

実行結果は次のとおりです。

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
)

この方法では、

foreach ($numbers as &$value)

のような参照を使わずに配列を更新できます。

参照による予期しない挙動を避けたい場合にも分かりやすい方法です。

foreachのkeyを条件判定に使う方法

特定のkeyを処理対象から除外する

取得したキーは、if文などの条件判定にも利用できます。

$user = [
    'name' => '田中',
    'password' => 'secret',
    'email' => 'tanaka@example.com'
];

foreach ($user as $key => $value) {
    if ($key === 'password') {
        continue;
    }

    echo "{$key}: {$value}" . PHP_EOL;
}

この例では、キーがpasswordの場合だけcontinueによって処理をスキップしています。

なお、実際のWebアプリケーションでは、パスワードを平文で保存することは避け、password_hash()などを利用して適切に管理する必要があります。

foreachのvalueを条件判定に使う方法

値によって処理を変更する

取得した値についても、通常の変数と同じように条件判定できます。

$scores = [
    '田中' => 80,
    '佐藤' => 45,
    '鈴木' => 90
];

foreach ($scores as $name => $score) {
    if ($score >= 60) {
        echo "{$name}:合格" . PHP_EOL;
    }
}

実行結果は次のとおりです。

田中:合格
鈴木:合格

この例では、キーを名前、値を点数として利用しています。

foreachでループ番号を取得する方法

keyとループ回数は同じとは限らない

foreach$keyが、必ず012のような連続した番号になるとは限りません。

たとえば、次の配列があります。

$items = [
    10 => 'PHP',
    20 => 'JavaScript',
    30 => 'Python'
];

次のように処理すると、

foreach ($items as $key => $value) {
    echo $key . PHP_EOL;
}

取得できるキーは102030です。

単純に何回目のループなのかを取得したい場合は、別途カウンターを用意できます。

$count = 0;

foreach ($items as $key => $value) {
    echo "{$count}: {$value}" . PHP_EOL;
    $count++;
}

array_valuesでキーを振り直す方法

元のキーが不要であれば、array_values()を使ってキーを0から振り直すこともできます。

foreach (array_values($items) as $index => $value) {
    echo "{$index}: {$value}" . PHP_EOL;
}

ただし、array_values()を使うと元のキー情報は維持されません。

元のキーが必要かどうかを考えて使い分けましょう。

foreachで最初や最後の要素を判定する方法

最後のkeyを取得する

PHPではarray_key_last()を利用すると、配列の最後のキーを取得できます。

$items = [
    'a' => 'PHP',
    'b' => 'JavaScript',
    'c' => 'Python'
];

$lastKey = array_key_last($items);

foreach ($items as $key => $value) {
    echo $value;

    if ($key !== $lastKey) {
        echo ', ';
    }
}

実行結果は次のようになります。

PHP, JavaScript, Python

同様に、最初のキーを取得したい場合はarray_key_first()を利用できます。

foreachでbreakとcontinueを使う方法

breakでforeachを終了する

条件を満たした時点でループそのものを終了したい場合は、breakを使用します。

$users = [
    100 => '田中',
    200 => '佐藤',
    300 => '鈴木'
];

foreach ($users as $id => $name) {
    if ($name === '佐藤') {
        echo "IDは{$id}です。";
        break;
    }
}

佐藤が見つかった時点でforeachが終了します。

continueで現在の処理をスキップする

特定の要素だけ処理を飛ばしたい場合はcontinueを使用します。

foreach ($users as $id => $name) {
    if ($id === 200) {
        continue;
    }

    echo "{$id}: {$name}" . PHP_EOL;
}

breakはループ全体を終了するのに対し、continueは現在の要素だけをスキップして次のループへ進みます。

オブジェクトをforeachで処理する方法

公開プロパティを取得する

foreachは配列だけでなく、オブジェクトにも利用できます。

たとえば、公開プロパティを持つオブジェクトは次のように処理できます。

class User
{
    public string $name = '田中';
    public int $age = 30;
}

$user = new User();

foreach ($user as $key => $value) {
    echo "{$key}: {$value}" . PHP_EOL;
}

オブジェクトを直接foreachで処理した場合、現在のスコープからアクセス可能なプロパティが処理対象になります。

より柔軟な反復処理を実装したい場合は、IteratorIteratorAggregateなどを利用する方法もあります。

foreachで取得するkeyの型

配列のkeyはintまたはstringになる

PHPの配列キーは、基本的にintまたはstringとして扱われます。

たとえば、次のような配列では整数キーと文字列キーが混在しています。

$data = [
    0 => 'PHP',
    'language' => 'JavaScript',
    10 => 'Python'
];

foreach ($data as $key => $value) {
    var_dump($key);
    var_dump($value);
}

キーの型を確認したい場合は、is_int()is_string()を利用できます。

foreach ($data as $key => $value) {
    if (is_int($key)) {
        echo '整数キーです。' . PHP_EOL;
    }

    if (is_string($key)) {
        echo '文字列キーです。' . PHP_EOL;
    }
}

なお、PHPでは配列のキーとして指定した値が、一定のルールに従ってintまたはstringへ変換されることがあります。

そのため、キーの型が重要な処理では、実際にどの型として格納されているかを確認するとよいでしょう。

HTML内でforeachを使う方法

foreachの代替構文を利用する

PHPでWebページを作成する場合は、HTML内でforeachを使用することもあります。

<?php
$users = [
    1 => '田中',
    2 => '佐藤',
    3 => '鈴木'
];
?>

<ul>
<?php foreach ($users as $id => $name): ?>
    <li>
        <?= htmlspecialchars((string) $id, ENT_QUOTES, 'UTF-8') ?>:
        <?= htmlspecialchars($name, ENT_QUOTES, 'UTF-8') ?>
    </li>
<?php endforeach; ?>
</ul>

HTMLテンプレートでは、

foreach (...):

と、

endforeach;

を組み合わせる代替構文を利用すると、PHPとHTMLの境界が分かりやすくなる場合があります。

PHPのforeachでよくある間違い

keyとvalueの順番を逆にしない

キーと値を取得する基本構文は次のとおりです。

foreach ($array as $key => $value) {
}

=>の左側がキー、右側が値です。

順番を逆に覚えないように注意しましょう。

keyをループ回数だと思い込まない

次のような配列では、

$array = [
    100 => 'PHP',
    500 => 'JavaScript'
];

foreachで取得できるキーは100500です。

foreach ($array as $key => $value) {
    echo $key . PHP_EOL;
}

実行結果は次のとおりです。

100
500

要素が2個だからといって、01が自動的に返されるわけではありません。

参照付きforeachの後にunsetを忘れない

次のように参照付きで処理した場合は注意が必要です。

foreach ($array as &$value) {
    // 処理
}

unset($value);

unset($value)を行わないと、$valueが最後の配列要素への参照を保持したままになります。

後から同じ変数名を使用した際に、意図しない値の変更が発生する可能性があります。

foreachとforの違い

配列の処理にはforeachが使いやすい

foreachは、配列などの要素を順番に処理するときに適しています。

foreach ($array as $key => $value) {
    // 配列の処理
}

一方、forはループ回数を数値で管理したい場合に適しています。

for ($i = 0; $i < 10; $i++) {
    echo $i;
}

PHPの配列はキーが連続した整数とは限らないため、配列の全要素を順番に処理する目的であれば、一般的にはforeachのほうがシンプルで分かりやすくなります。

PHPのforeachでkeyとvalueを取得する方法のまとめ

PHPでforeachを使ってキーと値を同時に取得する場合は、次の構文を使用します。

foreach ($array as $key => $value) {
    // $keyにはキー
    // $valueには値
}

値だけを取得する場合は、次のように記述できます。

foreach ($array as $value) {
    // 処理
}

数値添字配列では整数キー、連想配列では文字列キーを取得することが多くあります。

ただし、foreachで取得するキーは単純なループ番号ではなく、実際に配列に設定されているキーです。

また、元の配列を書き換えたい場合は、取得したキーを使って$array[$key]を変更する方法や、参照を利用する方法があります。

参照付きの、

foreach ($array as &$value)

を使用した場合は、ループ終了後に、

unset($value);

として参照を解除しておくことも重要です。

まずは、

foreach ($array as $key => $value)

では「$keyがキー、$valueが値」と覚えておけば、PHPの配列処理を幅広い場面で活用できるようになります。

以上、PHPのforeachでkeyとvalueを取得する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次