PHP数组与行为奇怪的关键值07&08

我有一个arrays几个月

$months[01] = 'January'; $months[02] = 'February'; $months[03] = 'March'; $months[04] = 'April'; $months[05] = 'May'; $months[06] = 'June'; $months[07] = 'July'; $months[08] = 'August'; $months[09] = 'September'; $months[10] = 'October'; $months[11] = 'November'; $months[12] = 'December'; 

现在该数组不会输出正确的值0708

尝试做print_r($months)你将不会得到任何关键值AugustSeptember零关键指数。

虽然我可以通过消除前导零来解决问题,但我仍然很想知道原因。

即使是PHP编辑器也发现了一些问题,但无法分辨出问题所在。

谢谢

在数字之前加上0表示PHP将其parsing为八进制值,方法与预先计算的0x相同,这样可以将其parsing为hex值。 删除零,它会正常工作。

 echo 07; // prints 7 echo 010; // prints 8 

这在指定unix权限时最常用:

 chmod("myfile", 0660); 

除此之外,很less有你想要做的事情。

这在PHP手册中有描述。

你形成一个整数文字的方式很重要。

查看十进制文字的结构? 注意前面的零是不是这个模式的一部分?

要么你必须删除零,或将您的数组键作为string

 $months['01'] = 'January'; $months['02'] = 'February'; // etc... 

一般来说,在数字上加上前导0会告诉编译器,你已经给出了一个八进制数(基数为8,而不是基数为10)。

在八进制中,8和9不存在(8是010,9是011),所以你很迷惑PHP。

如果你真的想要一个前导零,你可以使用string为您的索引

PHP会将前导0的数字视为八进制数字,或者删除前导0或将键值放在引号中。

经过宝贵的debugging和表头敲打后,我才意识到这一点。
问题是PHP不会引发错误,甚至不会提示错误的八进制文字整数。 它只是忽略了从错误到文字结尾的部分。
该死的。

PS:谁使用八进制数字? 从来没有,从来没有听说过有人使用他们有一个很好的理由。
hex是伟大的,但八进制? 该死的。
即使对于许可我通常做chmod ugo+rwx更直接。