簡體   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