奇怪的PHP扫描或数组分割错误

奇怪的PHP扫描或数组分割错误,php,arrays,split,scandir,Php,Arrays,Split,Scandir,首先,请原谅我,我还是个新手,现在有点累 我对此束手无策。我已经编写了一些PHP代码,这样我正在工作的站点就可以快速轻松地更新其新闻稿。我们的目标是将第一份时事通讯显示为嵌入式pdf,然后将其下的所有其他内容显示为链接,因此撰写时事通讯的人员只需将其放入文件夹并使用正确的命名格式即可 我正在使用scandir扫描目录,并以降序返回所有文件,这将首先给出最新的文件,前提是它们的名称正确(YYYY/MM)。然后,它将该文件名拆分,并将月份传递到一个函数中,该函数返回月份的实际名称,并将所有这些内容插

首先,请原谅我,我还是个新手,现在有点累

我对此束手无策。我已经编写了一些PHP代码,这样我正在工作的站点就可以快速轻松地更新其新闻稿。我们的目标是将第一份时事通讯显示为嵌入式pdf,然后将其下的所有其他内容显示为链接,因此撰写时事通讯的人员只需将其放入文件夹并使用正确的命名格式即可

我正在使用scandir扫描目录,并以降序返回所有文件,这将首先给出最新的文件,前提是它们的名称正确(YYYY/MM)。然后,它将该文件名拆分,并将月份传递到一个函数中,该函数返回月份的实际名称,并将所有这些内容插入html并生成页面

除了一件事,它工作得很好One文件不会显示月份。您可以在中看到,2014年8月的文件不会显示月份,我简直无法理解。(很抱歉底部的内容,我不能发布超过两个链接,因为我没有足够的代表,所以我不得不将所有图片合并成一个,忽略下半部分)

这是我的主程序的代码(很抱歉格式化了,因为这些愚蠢的限制,我不得不合并东西)

//按降序排序,以便最新日期为第一个
$newsletterarray=scandir(“../docs/newsletter”,scandir\u排序\u降序);
//打印(数组)//显示所有值
//将选定的新闻稿数组拆分为另一个数组,[1]将是可以传递到month.php的月份
$month=split(“\”,$newsletterarray[0]);
$filenameSplit=split(“\u1”,$newsletterarray[0]);
//最近的时事通讯已嵌入
回声('


旧的时事通讯'; //从1开始,因此它跳过最新的时事通讯 //递增,直到它比最大值少3,否则将显示目录内容
对于($i=1;$i而言,最大的问题是类型的混合。split()调用将返回月份('01','02',等)的字符串数组,但getMonth()函数的定义使其将值切换为整数(01,02等)

现在,PHP将允许这样做,因为它会为您做一些事情。但是您在如何解释交换机中的数字方面遇到了进一步的问题。具体地说,您的前导零导致它们被解释为八进制(基-8)数,而不是您期望的十进制(基-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传递的值相匹配,而不需要任何类型来破坏它们

除此之外,请允许我提供一些其他提示:

  • split()函数已失效,甚至在最近的PHP版本中都不可用。如果需要通过正则表达式拆分字符串,请使用preg_split()。在这种情况下,您只需通过字符串常量(“uu”)进行拆分,因此可以使用explode(),这正是您需要的。只需将split()调用切换为explode()调用,而不更改参数
  • 当您使用echo吐出HTML时,您真的应该对其进行转义。请参阅PHP的函数。使用您显示的特定文件名数据,您不会遇到问题,但其他数据可能会导致页面行为不当或存在安全漏洞
  • $month变量行可以删除。您不使用该变量,在它之后,您就有了$filenameSplit变量,该变量与$filenameSplit相同,但名称更好
  • getMonth()函数本身可以简化。对于这样一个简单的映射,我通常喜欢使用数组。使用这种技术,您的函数可能看起来像下面的getMonth2()。请参阅了解其工作原理。但是,在将月数转换为名称的特定情况下,您可以将其简化为一行,如getMonth3()中所示,请参阅和上的文档以了解此方法
  • 备选方案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
    
    function getMonth3($nummonth) {
        return date('F', strtotime("2017-$nummonth"));
    } //getMonth3