我有一个数月的数组
$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';
现在数组没有输出键07
&的正确值。 08
。
尝试执行print_r($months)
您将无法获得August
的任何键值September
和零键索引。
虽然我能够通过删除前导零来解决问题,但我仍然想知道相同的原因。
即使PHP编辑器发现了一些问题,但无法分辨出问题所在。
由于
答案 0 :(得分:9)
在数字前加0表示PHP将其解析为八进制值,其方式与前置0x相同,使得它被解析为十六进制值。删除零,它将正常工作。
echo 07; // prints 7
echo 010; // prints 8
这主要在指定unix权限时使用:
chmod("myfile", 0660);
除此之外,你很少想做的事情。
PHP Manual中描述了这一点。
答案 1 :(得分:3)
形成integer literal的方式非常重要。
查看十进制文字的结构?注意前面的零如何不是该模式的一部分?
您必须删除零,或将数组键视为字符串
$months['01'] = 'January';
$months['02'] = 'February';
// etc...
答案 2 :(得分:2)
通常,在数字上加一个前导0告诉编译器你给出了一个八进制数(基数为8,而不是数字10)。
在八进制中,8和9不存在(8是010,9是011),所以你混淆了php。
如果你真的想要一个前导零,你可以为索引使用字符串
答案 3 :(得分:2)
PHP会将前导0的数字视为八进制数,或者删除前导0或将键值放在引号中。
答案 4 :(得分:0)
我只是在经过宝贵的调试和桌面敲击之后才意识到这一点 问题是PHP不会引发错误甚至是关于八进制文字整数格式错误的警告。它只是忽略了从错误到文字结尾的部分 该死的。
PS:谁使用八进制数?从来没有,从来没有听说有人使用它们是有充分理由的
十六进制是伟大的,但八进制?该死的。
即使是获得许可,我通常也会chmod ugo+rwx
更直接。