繁体   English   中英

数组出现奇怪的PHP Scandir或Split错误

[英]Strange PHP Scandir or Split error with array

首先,请原谅我,我对此还很陌生,现在有点累。

我为此不知所措。 我写了一些PHP代码,以便我正在工作的网站可以快速,轻松地更新新闻稿。 目的是将第一个新闻通讯显示为嵌入式pdf,然后将所有其余新闻显示为其下方的链接,因此,编写新闻通讯的所有人员需要做的就是将它们放在文件夹中并使用正确的命名格式。

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

除了一件事,它完美地工作。 一个文件不会显示月份。 您可以在屏幕截图中看到,2014年8月的文件不会显示月份,我根本无法弄清楚。 (对于底部的内容,很抱歉,我不能发布两个以上的链接,因为我没有足够的代表,所以我不得不将所有图像都合而为一,而不必考虑底部的一半)

这是我的主程序的代码(对格式感到抱歉,由于这些愚蠢的限制,我不得不组合东西)

//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;
    }
}

在屏幕截图中,您可以看到我进行的一些故障排除。 您可以看到split表示1应该是08的正确值,但是当我将其传递给getMonth函数时,它将不起作用。 您还将看到传递08很好,所以该错误似乎不在getMonth函数中。 除此之外,我尝试将文件添加到实际目录中,该文件根本没有更改错误,但是预期的功能确实起作用。 我也尝试删除有问题的文件并重命名另一个文件以具有相同的名称,但是发生了相同的错误。

我真的希望这只是一个愚蠢的错误,我在其中写了一些阻止该特定文件正常工作的内容,这确实使我有些悲痛。 谢谢。

您最大的问题是类型的混合。 您的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传入的值匹配,而不会发生任何类型的折衷事情。

不过,除此之外,我还可以提供其他一些提示:

  1. split()函数已失效,甚至在最新的PHP版本中也不可用。 如果需要按正则表达式拆分字符串,请使用preg_split()。 在这种情况下,您只是用字符串常量('_')进行拆分,因此可以使用explode()来完成您在此所需的操作。 只需将您的split()调用切换为explode()调用,而无需更改参数。
  2. 当您使用echo吐出HTML时,您实际上应该将其转义。 参见PHP的htmlentities()函数。 使用显示的特定文件名数据,您不会遇到问题,但是其他数据可能会导致页面行为异常或出现安全漏洞。
  3. $ month变量行可以删除。 您无需使用该变量,紧随其后的是$ filenameSplit变量,它是相同的东西,但命名更好。
  4. getMonth()函数本身可以简化。 对于这样的简单映射,我经常喜欢使用数组。 使用此技术,您的函数可能类似于下面的getMonth2()。 有关数组的工作原理,请参见PHP的有关数组的文档 但是,在这种将月份数字转换为名称的特定情况下,可以将其减少为单行格式,如下面的getMonth3()所示。 有关此方法,请参阅有关date()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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM