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"
// }
以上。