2010-04-16 80 views
0

我在函數後會讓我對4個數組進行一堆文件名的排序。 但是,即使文件數量發生變化,文件也必須始終保存在同一個陣列中。對4個數組進行排序的文件(字符串)

例如,如果我有文件 myfile.html anotherfile.html morefiles.html 的test.html

和我的陣列 數組1,數組2,ARRAY3,array4

如果我運行此函數,那麼 array1可能會得到myfile.html和anotherfile.html

如果我再次運行它並添加一些文件(或更少的文件,如不通過anotherfile.html),那麼我仍然會期望array1 t o get myfile.html

所以只需要一些散列文件名的方法,然後我可以使用它指向特定的數組,因此不是隨機的或者是檢查每個數組中有多少文件需要保持一致的隨機文件。

+2

,什麼是爲什麼'myfile.html'進入狀態到'array1'而不是'array2'? – 2010-04-16 12:02:14

+0

這是我的問題....喜歡,也許你可以在文件上做一個crc32,如果結果是奇數去array1但如果結果是甚至去array2 ..但只處理兩個數組(並使用crc32可能不是最好的) – Wizzard 2010-04-16 12:18:18

回答

2

有很多不同的方法可以解決這樣的任務,下面是非常的這個主題的基本介紹。如果它有用,那麼很好,否則我希望它至少可以告訴你什麼地方你可能想去(或不去!)。

這個例子簡單地採用了文件名的散列(在這種情況下,MD5只是因爲你可能熟悉它)。 sscanf只是得到散列的第一個字符,並將其轉換爲0到15之間的數字(因爲md5()返回一個十六進制數字)。由於我們只想在四個數組之間進行分配,因此使用模運算符(%),因此$num將始終導致0,1,2或3,然後將其用作數組鍵(請參閱$ array1,$ array2等)。

$files = array('a.html','b.html','c.html','d.html'); 
$arrays = 4; 
$array = array_fill(0, $arrays, array()); 
// For each file name put it into the appropriate slot in $array 
foreach ($files as $filename) { 
    sscanf(md5($filename), '%1x', $hex); 
    $key = $hex % $arrays; 
    $array[$key][] = $filename; 
} 
// See what happened 
var_dump($array); 

對於這個特殊的例子,所產生的數組(如果你喜歡,你可以推到你的獨立變量)具有以下結構:

$array = array(
    0 => array() 
    1 => array('c.html') 
    2 => array('d.html') 
    3 => array('a.html', 'b.html') 
); 
+0

太好了!正是我所追求的。 – Wizzard 2010-04-16 20:09:04