2012-06-30 78 views
0

所以我用下面的代碼從一個文件夾拉一個隨機文件,我想使它所以不會再拉起當前文件的機會(即:連續兩次看到相同的圖像/文檔)。隨機文件夾從(不重複)

我該怎麼辦?提前致謝!

function random_file($dir = 'destinations') 
{ 
    $files = glob($dir . '/*.*'); 
    $file = array_rand($files); 
    return $files[$file]; 
} 
+0

你的問題是模糊的...你只是意味着你不希望看到它連續兩次,或者你真的不想再看到文件,永遠不會消失? –

+0

你的意思是在一個請求?還是應該在請求之間堅持? – MDrollette

回答

1

存儲在cookie或在會議最後一次查看的文件名。

下面是如何用一個cookie做到這一點:

function random_file($dir = 'destinations') { 
    $files = glob($dir . '/*.*'); 
    if (!$files) return false; 
    $files = array_diff($files, array(@$_COOKIE['last_file'])); 
    $file = array_rand($files); 
    setcookie('last_file', $files[$file]); 
    return $files[$file]; 
} 
+0

這似乎是完美的工作!使用cookie有什麼缺點嗎? – marck

+0

編輯:我實際上得到一個「頭已發送」的錯誤。 – marck

+0

「頭文件已發送」錯誤表示您在調用setcookie()之前已將某些內容打印到瀏覽器中。您可以撥打random_file()開始打印前的事情,或者你可以使用一個會話變量,比如'$ _SESSION [ 'last_file']',而不是'的setcookie()'和'$ _COOKIE [ 'last_file']'。 –

0

本質:存儲在數組中使用的每個文件的名稱;每次你拉一個新名字時,檢查它是否已經存在於數組中。

in_array()會幫你。 array_push()將幫助填充「使用的文件」數組。

你可以使陣列static一個有列表可供您隨時調用函數(而不是使用全局變量)。

1
$picker = new FilePicker(); 
$picker->randomFile(); 
$picker->randomFile(); // never the same as the previous 

-

class FilePicker 
{ 
    private $lastFile; 

    public function randomFile($dir = 'destinations') 
    { 
     $files = glob($dir . '/*.*'); 

     do { 
      $file = array_rand($files); 
     } while ($this->lastFile == $file); 

     $this->lastFile = $file; 

     return $files[$file]; 
    } 
} 
0

如果你想提出一個固定的一組以隨機順序文件, 然後讀取所有文件名放入一個數組中,隨機數組 ,然後從頭到尾使用數組。

+0

我寧願避免將它們輸入到數組中,因爲如果有很多文件它可能會變得太乏味。 – marck

+0

呃?用readdir讀取文件名。但無論如何,既然你沒有「重複」,那麼它就足以記住最後一個文件。 – KarlP