2013-08-23 94 views
0

我有一些代碼適合我。不過,我現在正在修改它,以免在每次刷新頁面時進行更改,而是在週一只刷新一次。如何將此更改爲每週而不是每次刷新?

改變它在每次刷新的代碼是:

<center><?php 
    ?><div style="min-height: 75px; padding-top: 0px; padding-left: 5px; padding-right: 5px;"> 
    <?php 
$file = "/pathway/to/the_file/on_the_server/theme_name/file_name.txt"; 
$quote = file($file); 
echo $quote[array_rand($quote)]; 
?></div></center> 

我一直在尋找周圍的答案,並沒有遇不到足夠的例子來改變這種狀況。我認爲迄今爲止我發現的最接近可能的例子是基於任何東西[1]

[1]:How to show different image every 2 weeks in php?。我從該鏈接定位的具體示例如下:

$week = date('W'); 
$changes = (int)(($week-1)/2); 
$image = $changes % 8 + 1; 

printf("Week: %d, Images changed: %d, Current Image: %d\n" 
    , $week, $changes, $image); 

現在,使用該示例,似乎需要知道「圖像」的數量。由於我正在使用一個我將不斷添加的報價文件,因此我不打算計算其中有多少引號,也不是每次向文件添加更多引號時不斷更改此代碼。

有沒有一種方法可以改變這個例子,以適應我正在努力做我正在尋找的東西,還是我不在正確的道路上?

在此先感謝您的意見。

回答

0

您可以使用filemtime()來確定文件上次更改的時間。該文件說「時間返回爲Unix timestamp」,這意味着它在幾秒鐘內。您可以通過time()獲得當前時間。您可以使用date('N')獲得一週中的某一天。您可以使用file_get_contents()file_put_contents()來獲取和編寫「當前報價文件」的內容。

爲了穩定性,最好檢查一下file_exists()

$currentQuoteFile = "current-quote.txt"; 
$quoteFile = "all-quotes.txt"; 

if (!file_exists($currentQuoteFile)) { 
    // Create a new "current quote file" if it doesn't exist yet. 
    $pickNewQuote = true; 
} else { 
    $lastModified = filemtime($currentQuoteFile); 

    $oneDayInSeconds = 60 * 60 * 24; 
    $oneWeekInSeconds = $oneDayInSeconds * 7; 

    // Look for the Monday on or before the last modified date. This lets us 
    // emulate "updating on Monday" without actually requiring someone to visit 
    // this page every Monday. 
    $lastModified -= (date("N", $lastModified) - 1) * $oneDayInSeconds; 

    // If the current time is at least a week later than the Monday on or 
    // before the quote file was updated, we need to pick a new quote. 
    $pickNewQuote = time() - $oneWeekInSeconds > $lastModified; 
} 

if ($pickNewQuote) { 
    $quotes = file($quoteFile); 
    $quote = $quotes[array_rand($quotes)]; 
    file_put_contents($currentQuoteFile, $quote); 
} else { 
    $quote = file_get_contents($currentQuoteFile); 
} 

爲了進一步說明了「查找週一或最後修改日期前」,考慮如果您的網站在週四訪問,則週二會發生什麼。星期四,您將創建一個新的當前報價文件,並且在星期二它將在文件上次更新後不到一週,但我們希望使它看起來像我們在星期一更新的。通過查看上次修改時間之前的星期一,我們會看到自那一天起已經過了一週,所以我們將創建一個新的當前報價文件。

您可以通過刪除小時和分鐘部分來使其更好,因此它在星期一午夜總是會「更新」,但我太累了不能寫出來,並且您應該能夠使用它來解決問題date(),或者只是一些聰明的劃分和乘法。

+0

感謝所有這些偉大的信息!使用第二個代碼顯示,是否每週都會更改(而不是定位星期一,只是一週中的任何時間)?我不確定爲什麼有兩個文件可以引用而不是一個? – user2376452

+0

@ user2376452我想到了一個更好的方法。這個新版本與星期一每週更新一次的效果相同,但不需要任何人在週一實際訪問該頁面。我希望它的工作原理足夠清楚。有兩個文件的原因是其中一個包含當前選定的報價('$ currentQuoteFile'),另一個包含可能的報價的完整列表('$ quoteFile')。 –

+0

感謝您的優秀解釋!這是否假設我正在手動更改當前報價文件?我目前使用它隨機抽取的1個文件。提供的代碼是否可以從1個文件中隨機抽取? – user2376452

0

你可以做這樣的事情。您可以將照片文件的名稱及其更改的最後日期存儲在文件中。在星期一,照片會更改並登錄到該文件。使用array_rand最終可能會在每週重複一次。您可以輕鬆添加額外的邏輯,以確保陣列中的新照片與前一週不一樣。希望有幫助

if (date('l') == 'Monday') { 
    $aFileContents = file('photoDate.txt'); 

    if($aFileContents[1] == date('Y-m-d')) { 
     $photo = $aFileContents[0]; 
    } else { 
     $photo = array_rand($aPhotoArray); 
     $fp = fopen('photoDate.txt', 'w'); 
     fwrite($fp, $photo . '\n'); 
     fwrite($fp, date('Y-m-d')); 
     fclose($fp); 
    } 
} else { 
    $aFileContents = file('photoDate.txt'); 
    $photo = $aFileContents[0]; 
} 
+0

對於換行符,它需要雙引號('「\ n」',而不是'\ n'')。 –