2011-01-20 44 views
5

举止异常我有个PHP数组键值07和08

$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)你将不会得到任何关键值AugustSeptember的零关键指数。

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

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

由于

回答

9

前面附加0前的数是指PHP解析它在同样的方式,在前面加上0X导致它被解析为一个十六进制值的八进制值。删除零,它会正常工作。

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

这指定UNIX权限时主要用于:

chmod("myfile", 0660); 

除了它是很少的东西,你想要做的事。

这在PHP Manual中描述。

+0

Thanx,这解释了一些事情。 – 2011-01-22 09:29:27

2

通常,在数字上加上前导0会告诉编译器,您提供了一个八进制数(基数为8,而不是基数为10)。

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

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

2

PHP将把数字与0领先的八进制数,要么丢弃0领先或将键值引号。

3

您形成integer literal的方式很重要。

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

要么你必须删除零,或把你的数组键作为字符串

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

我只是调试和表头撞宝贵的几分钟后,意识到这一点。
问题是,PHP不会引发错误,甚至不会警告错误的八进制文字整数。它只是忽略了直到文字结尾的错误部分。
该死的。

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