У меня есть массив в течение нескольких месяцев
$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 до числа означает, что PHP анализирует его как восьмеричное значение таким же образом, что добавление 0x заставляет его анализироваться как шестнадцатеричное значение. Удалите нуль, и он будет работать нормально.
echo 07; // prints 7 echo 010; // prints 8
Это чаще всего используется при указании разрешений unix:
chmod("myfile", 0660);
Кроме того, это редко то, что вы хотели бы сделать.
Это описано в Руководстве по PHP .
Важное значение имеет способ формирования целочисленного литерала .
См. Структуру десятичных литералов? Обратите внимание, что предыдущий ноль не является частью этого шаблона?
Либо вы должны удалить нули, либо обрабатывать ключи массива в виде строк
$months['01'] = 'January'; $months['02'] = 'February'; // etc...
Как правило, помещание ведущего 0 в число сообщает компилятору, что вы указываете восьмеричное число (база 8, а не база 10).
В восьмеричных 8 и 9 не существует (8 – 010, 9 равно 011), поэтому вы путаете php.
Если вам действительно нужен ноль, вы можете использовать строки для своих индексов
PHP будет обрабатывать числа с ведущим 0 как восьмеричные числа, либо отбрасывать ведущее 0, либо вводить ключевые значения в кавычки.
Я просто понял это после драгоценных минут отладки и стука в стол.
Проблема в том, что PHP не вызывает ошибки или даже предупреждения о том, что он исказил восьмеричное целое число. Он просто игнорирует часть от ошибки до конца литерала.
Черт.
PS: Кто использует восьмеричные цифры? никогда не слышал, чтобы кто-то использовал их по уважительной причине.
Шестнадцатеричный большой, но восьмеричный? черт.
Даже для разрешения я обычно делаю chmod ugo+rwx
более простым.