php数组表现奇怪,键值为07& 08

时间:2011-01-20 18:06:00

标签: php 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';

现在数组没有输出键07&的正确值。 08

尝试执行print_r($months)您将无法获得August的任何键值September和零键索引。

虽然我能够通过删除前导零来解决问题,但我仍然想知道相同的原因。

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

由于

5 个答案:

答案 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更直接。