Странная ошибка PHP Scandir или Split с массивом

Во-первых, пожалуйста, прости меня, я все еще новичок в этом, и я немного устал сейчас.

Я в своем уме над этим. Я написал небольшой код PHP, чтобы сайт, на котором я работаю, мог быстро и легко обновлять свои новостные рассылки. Цель состоит в том, чтобы показать первый информационный бюллетень в виде встроенного PDF-файла, а затем показать все остальные в виде ссылок под ним, поэтому все, что нужно сделать тем, кто пишет информационные бюллетени, это поместить их в папку и использовать надлежащий формат имен.

Я использую scandir для сканирования каталога и возврата всех файлов в порядке убывания, который сначала выдаст самый последний файл при условии, что они названы правильно (ГГГГ / ММ). Затем он разбивает это имя на файл и передает месяц в функцию, которая возвращает фактическое имя месяца, и вставляет все это в HTML и генерирует страницу.

Работает отлично, кроме одной вещи. Один файл не показывает месяц. Вы можете увидеть в Скриншот что файл за август 2014 года не будет показывать месяц, и я просто не могу понять это. (Извините за материал внизу, я не могу опубликовать более двух ссылок, потому что мне не хватает представителя, поэтому мне пришлось превратить все мои изображения в одно, не обращая внимания на нижнюю половину)

Вот код для моей основной программы (извините за форматирование, мне пришлось комбинировать вещи из-за этих глупых ограничений)

//sort in descending order so the most recent date is first
$newsletterarray=scandir("../docs/newsletter", SCANDIR_SORT_DESCENDING);

//print_r($newsletterarray); //shows all the values

//Splits the selected newsletter array into another array, [1] will be the month which can be passed into month.php
$month = split("_", $newsletterarray[0]);

$filenameSplit = split("_", $newsletterarray[0]);
//The most recent newsletter is embedded
echo('<p>
<a href="../docs/newsletter/' . $newsletterarray[0] . '"><h4 align="justify">' . getMonth($filenameSplit[1]) . ' ' . $filenameSplit[0] . ' Newsletter</h4></a>
</p>
<p>
<object width="50%" height="500px" data="../docs/newsletter/' . $newsletterarray[0] . '" type="application/pdf"></object>
</p><br> <h4>Older Newsletters</h4>');

//starts at 1 so it skips the most recent newsletter
//increments until it reaches 3 less than max, otherwise it shows directory stuff
for( $i = 1; $i <= (count($newsletterarray) - 3); $i++) {
$filenameSplit = split("_", $newsletterarray[$i]);
echo('<a href="../docs/newsletter/' . $newsletterarray[$i] . '">' . getMonth($filenameSplit[1]) . ' ' . $filenameSplit[0] . ' Newsletter</a><br>');
}

function getMonth($nummonth) {
switch ($nummonth) {
case 01:
return "January";
break;
case 02;
return "February";
break;
case 03:
return "March";
break;
case 04:
return "April";
break;
case 05:
return "May";
break;
case 06:
return "June";
break;
case 07:
return "July";
break;
case 08:
return "August";
break;
case 09:
return "September";
break;
case 10:
return "October";
break;
case 11:
return "November";
break;
case 12:
return "December";
break;
default:
return "";
break;
}
}

На скриншоте вы можете увидеть некоторые из устранения неисправностей, которые я сделал. Вы можете видеть, что раскол говорит, что 1 должно быть правильное значение для 08, но когда я передаю его в функцию getMonth, оно не работает. Вы также увидите, что передача в 08 работает просто отлично, поэтому, похоже, ошибка отсутствует в функции getMonth.
В дополнение к этому я попытался добавить файл в настоящий каталог, что не изменило ошибку вообще, но предполагаемая функциональность работала. Я также попытался удалить проблемный файл и переименовать другой файл с таким же именем, но произошла та же ошибка.

Я действительно надеюсь, что это просто глупая ошибка, когда я написал что-то, что мешает работе этого конкретного файла, это действительно вызывает у меня некоторое горе. Спасибо.

0

Решение

Ваша самая большая проблема — смешивание типов. Ваши вызовы split () вернут массив строки за месяц (’01’, ’02’ и т. д.), но ваша функция getMonth () определена так, что она включает значения как целые (01, 02 и т. Д.).

Теперь PHP разрешит это, потому что это сделает жонглирование для тебя. Но вы столкнулись с дальнейшими проблемами, связанными с интерпретацией чисел в вашем коммутаторе В частности, ваши ведущие нули заставляют их интерпретироваться как восьмеричные (base-8) числа, а не как десятичные (base-10) числа, которые вы ожидаете.

Мы могли бы углубиться в кровавые подробности, но они на самом деле здесь не важны, потому что вы должны исправить это, последовательно представляя свои числа. Самый быстрый способ сделать это — заменить каждое из значений переключателя внутри getMonth () на значения в кавычках:

function getMonth($nummonth) {
switch ($nummonth) {
case '01':
return "January";
break;
case 02;
return "February";
break;
case '03':
return "March";
break;
case '04':
return "April";
break;
case '05':
return "May";
break;
case '06':
return "June";
break;
case '07':
return "July";
break;
case '08':
return "August";
break;
case '09':
return "September";
break;
case '10':
return "October";
break;
case '11':
return "November";
break;
case '12':
return "December";
break;
default:
return "";
break;
}
}

Это должно заставить вещи работать на вас. Он работает, рассматривая эти значения как строки, что позволяет им соответствовать значениям, которые вы передаете для $ nummonth, без каких-либо манипуляций с типами.

Помимо этого, позвольте мне еще несколько советов:

  1. Функция split () не работает, даже недоступна в последних версиях PHP. Если вам нужно разбить строку по регулярному выражению, используйте preg_split (). В этом случае вы просто разделяете на строковую константу (‘_’), поэтому вы можете использовать explode (), которая делает именно то, что вам нужно. Просто переключите вызовы split () на вызовы explode () без изменения параметров.
  2. Когда вы используете echo, чтобы выплюнуть HTML, вы действительно должны его избегать. Смотрите PHP htmlentities () функция. С указанными вами конкретными именами файлов вы не столкнетесь с проблемой, но другие данные могут привести к неправильной работе страницы или появлению уязвимости безопасности.
  3. Переменная $ month может быть удалена. Вы не используете эту переменную, и сразу после нее у вас есть переменная $ filenameSplit, которая является тем же самым, но намного лучше названа.
  4. Сама функция getMonth () может быть упрощена. Для такого простого сопоставления мне часто нравится использовать массив. С этой техникой ваша функция может выглядеть как getMonth2 () ниже. Увидеть PHP документы по массивам чтобы узнать, как это работает. Однако в этом конкретном случае преобразования номера месяца в имя вы можете уменьшить его до однострочного, как в getMonth3 () ниже. Смотрите документы на Дата() а также StrToTime () узнать об этом подходе.

Альтернатива 1: использование массива в качестве карты:

function getMonth2($nummonth) {
$months = array(
'01' => 'January',
'02' => 'February',
'03' => 'March',
'04' => 'April',
'05' => 'May',
'06' => 'June',
'07' => 'July',
'08' => 'August',
'09' => 'September',
'10' => 'October',
'11' => 'November',
'12' => 'December',
); //$months

return $months[$nummonth];
} //getMonth2

Альтернатива 2: использование функций PHP, связанных с датой

function getMonth3($nummonth) {
return date('F', strtotime("2017-$nummonth"));
} //getMonth3
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector