【PHP】foreach文のおもしろい挙動

foreach文を使ってて、不思議な挙動を見つけたのでメモとして残します。
結論から言えば、foreach文ではキーが数値に変換されるようです。

環境

  • PHP 7.1
  • PHP 5.4

そのほかのバージョンでも同じような動作になると思いますが未確認です。

$data1 = array(
    '+1' => '+1',
    '-1' => '-1',
    '0' => '0', 
);
foreach ($data1 as $key => $value) {

    if ($key === '+1') {
        echo '+1';
    } else if ($key === -1) {
        echo ', -1(int)';
    } else if ($key === 0) {
        echo ', 0(int)';
    }
    // 実行結果
    // +1, -1(int), 0(int)
}

実行結果からstring → intに変換されていることがわかります。
ちなみに$valueはstringのままなので注意が必要です。

おまけ

以下の場合でもforeach文と同じくintに変換されてしまいます。

$data2 = array_filter($data1, function($value) {
    return true;
});
var_dump($data2);
// array(3) {
//   ["+1"]=>
//   string(2) "+1"
//   [-1]=>
//   string(2) "-1"
//   [0]=>
//   string(1) "0"
// }

$data3 = array_map(function ($value) {
    return $value;
}, $data1);
var_dump($data3);
// array(3) {
//   ["+1"]=>
//   string(2) "+1"
//   [-1]=>
//   string(2) "-1"
//   [0]=>
//   string(1) "0"
// }

以上。