数年前にPHPで大はまりしたことを思い出したので、書いてみます。
それは都道府県を扱うプログラムで、都道府県のリストが設定ファイルにPHPで記述されていました。
$prefectures = array(
01 => '北海道',
02 => '青森県',
03 => '岩手県',
04 => '宮城県',
05 => '秋田県',
06 => '山形県',
07 => '福島県',
08 => '茨城県',
09 => '栃木県',
10 => '群馬県',
11 => '埼玉県',
// ...
);
var_dump($prefectures);
左の数字はJIS規格やISO規格に定められている都道府県コードで、規格として書くときは一般に0埋めされています。
例:
http://www.shift-the-oracle.com/etc/database/jis-x-401.html
これをそのまま整形してプログラムにしてしまったところに落とし穴がありました。
まず、PHPでは0から始まる数字は8進数になります。これはご存じの方が多いと思います。
しかし、8進数として正しくない文字が来た場合には エラーにも警告にもならず単に無視される というのは意外な仕様ではないでしょうか。(Perl, PythonやC言語などではエラーになります。)
マニュアルにも記述はあります。
http://php.net/manual/ja/language.types.integer.php
ここまで来ると、どういうことになるかわかると思います。
結果は、このようになります。
array(10) {
[1]=>
string(9) "北海道"
[2]=>
string(9) "青森県"
[3]=>
string(9) "岩手県"
[4]=>
string(9) "宮城県"
[5]=>
string(9) "秋田県"
[6]=>
string(9) "山形県"
[7]=>
string(9) "福島県"
[0]=>
string(9) "栃木県"
[10]=>
string(9) "群馬県"
[11]=>
string(9) "埼玉県"
}
茨城県が消失し、栃木県が黙って0になります。エラーにも警告にもNoticeにもなりません!
怖いですね。
都道府県のリストを書くときは、0埋めするのはやめましょう!