2010-04-16 52 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