2016-11-18 44 views
1

我試圖從「相關」目錄中的文件數組中獲得2個隨機結果。我設法從目錄中隨機抽取兩個結果,但我需要避免某些結果,具體取決於與特定文件名相關的變量。從隨機數組中省略某些結果PHP

到目前爲止我的代碼是:

$foo = "bar.php"; 
function random_file($dir) { 
    $files = opendir($dir . '/*.php'); 
    $rand_files = array_rand($files, 2); 
    return array(include $files[$rand_files[0]], include $files[$rand_files[1]]); 
} 
list($file_1,$file_2) = random_file("related"); 

我試圖拉開兩個隨機的結果,但避免了文件:bar.php。有沒有人知道有一種方法可以省略數組中的某些結果,因爲我甚至無法在網上找到任何東西?

+0

你的排除標準是基於某個字符串或排除列表數組? –

+0

'opendir()'在這裏不起作用,使用'scandir()'然後過濾數組。該代碼是否工作? – JustOnUnderMillions

+0

是的,我會將此代碼添加到許多頁面,並且字符串將根據頁面 –

回答

0

試試這個。它將使您的隨機陣列直到其選擇兩個記錄不包括bar.php

$rand_files = array_rand($files, 2); 
while(in_array("bar.php",$rand_files)) 
{ 
    $rand_files = array_rand($files, 2); 
} 
+2

也許你可以解釋你的代碼... –

+0

雖然這段代碼可以解決問題,但它並不能解釋爲什麼或者它如何回答問題。請[請提供您的代碼解釋](// meta.stackexchange.com/q/114762/269535),因爲這確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 **標記/評論者:** [僅限代碼解答,例如這個,downvote,不要刪除!](// meta.stackoverflow.com/a/260413/2747593) –

+0

當然是男人。完成。 –

1

可以使用glob功能與特定的正則表達式來僅選擇爲你匹配的名字。這會將您的初始$files變量限制爲符合您的條件的結果,並且您可以繼續進行隨機抽樣而不做任何修改。

// entries containing foo will not be included 
function random_file($dir) { 
    $files = glob("^(?!bar.php)*"); 
    $rand_files = array_rand($files, 2); 
    return array(include $files[$rand_files[0]], include $files[$rand_files[1]]); 
} 
list($file_1,$file_2) = random_file("related"); 
+0

這看起來像我需要的,但添加正則表達式導致沒有結果回來。試圖弄清楚爲什麼現在。 –

+1

這似乎比我的解決方案更優雅。我沒有親自測試過,但只要你的正則表達式設置正確,我看不出有任何理由,這不會起作用。 –

+0

basedir的一個額外參數(glob的起始文件夾)會很好。但是,無論問題是100%回答:) – JustOnUnderMillions

0

您還需要考慮諸如'。'之類的目錄。和'..'。我認爲一個switch語句和一個unset()爲整個數組中的值將工作。然後,一旦你有一個文件不包括你不想要的數組。然後您可以拉兩個隨機數並返回該數組。

此代碼可能不是100%完美,但應該讓您朝正確的方向發展。

function random_file($dir) { 
$fileArray = array(); 

if (is_dir($dir)) { 
    if ($dh = opendir($dir . '/*.php')) { 
     while (($file = readdir($dh)) !== false) { 
      $fileArray = array_push($fileArray, $file) 
     } 

     for($i = 0; $i < count($fileArray); $i++) { 
      switch($fileArray) { 
       case '.': 
        unset($array[$i]); 
        break; 
       case '..': 
        unset($array[$i]); 
        break; 
       case 'bar.php': 
        unset($array[$i]); 
        break; 
      } 
     } 
    } 
    closedir($dh); 
} 

$rand_files_keys = array_rand($fileArray, 2); 
$rand_files = $fileArray[$rand_files_keys[0]]; 
$rand_files = $fileArray[$rand_files_keys[1]]; 
return $rand_files; 
+0

如果給出'$ dir',返回文件的完整路徑不是更好嗎?他想包括他們! :) – JustOnUnderMillions