Во-первых, пожалуйста, прости меня, я все еще новичок в этом, и я немного устал сейчас.
Я в своем уме над этим. Я написал небольшой код 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.
В дополнение к этому я попытался добавить файл в настоящий каталог, что не изменило ошибку вообще, но предполагаемая функциональность работала. Я также попытался удалить проблемный файл и переименовать другой файл с таким же именем, но произошла та же ошибка.
Я действительно надеюсь, что это просто глупая ошибка, когда я написал что-то, что мешает работе этого конкретного файла, это действительно вызывает у меня некоторое горе. Спасибо.
Ваша самая большая проблема — смешивание типов. Ваши вызовы 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: использование массива в качестве карты:
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
Других решений пока нет …