2011-01-20 6 views
5

que tiene una serie de mesesPHP matriz comporta de forma extraña con el valor de la clave 07 y 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'; 

Ahora la matriz tiene valor correcto no se emiten para la clave 07 & 08.

Intente hacer print_r($months) no obtendrá ningún valor de clave August y cero índice de clave para September.

Aunque soy capaz de resolver el problema eliminando el cero inicial, aún así me gustaría saber el motivo.

Incluso el editor de PHP detecta algún problema pero no puede decir cuál es el problema.

Gracias

Respuesta

9

agregar prefijos a 0 antes significa un número PHP lo analiza como un valor octal de la misma manera que anteponiendo 0x hace que se analiza como un valor hexadecimal. Retire el cero, y funcionará bien.

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

Esto se utiliza sobre todo cuando se especifica los permisos de Unix:

chmod("myfile", 0660); 

excepción de que rara vez es algo que le gustaría hacer.

Esto se describe en el PHP Manual.

+0

Gracias, esto explica las cosas. –

2

En general, al poner un 0 inicial en un número le dice al compilador que está dando un número octal (base 8, no base 10).

En octal, 8 y 9 no existen (8 es 010, 9 es 011), por lo que está confundiendo php.

Si realmente desea un cero, puede utilizar cadenas para sus índices

2

PHP tratará números con un 0 números octales, o bien dejar el 0 o poner los valores clave entre comillas.

3

La forma en que se forma un integer literal es importante.

¿Ves la estructura para literales decimales? Observe cómo un cero anterior no es parte de ese patrón?

O se tiene que quitar los ceros, o tratar sus claves de matriz como cadenas

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

Me di cuenta de esto después de preciosos minutos de la depuración y la cabeza golpeando la mesa.
El problema es que PHP no genera un error o incluso una advertencia acerca de tener malformado el entero octal literal. Simplemente ignora la parte del error hasta el final del literal.
Maldita sea.

PD: ¿Quién usa números octales? nunca lo hizo, nunca escuché que alguien los usara por una buena razón.
Hexadecimal es genial, pero octal? Maldita sea.
Incluso para obtener el permiso, generalmente hago chmod ugo+rwx es más sencillo.

Cuestiones relacionadas