2011-06-08 27 views
1

在小组中组合并维持秩序的最佳方式是什么?在维持组内订单的同时对数组值进行分组?

我有一个数组完整的文件目录路径。数组文件路径按文件创建日期排序。

我想保持这些文件的创建日期的顺序,但也组他们,他们是在哪个目录顺序

例:

array() { 
[1]=> "media/abstract/safe.png" 
[2]=> "media/urban/Cross Street 2.png" 
[4]=> "media/urban/The Other Side.png" 
[5]=> "media/urban/Pharm Child.png" 
[6]=> "media/food/DSC_3017.png" 
[7]=> "media/abstract/fractal_twins.png" 
[9]=> "media/urban/Amsterdam.png" 
[11]=> "media/nature/creep.png" 
[12]=> "media/urban/obstructed.png" 
[13]=> "media/nature/middletown_dreams.png" 
} 

重新排序会是什么样子:

array() { 
[1]=> "media/abstract/safe.png" 
[2]=> "media/abstract/fractal_twins.png" 
[3]=> "media/food/DSC_3017.png" 
[4]=> "media/nature/creep.png" 
[5]=> "media/nature/middletown_dreams.png" 
[6]=> "media/urban/Cross Street 2.png" 
[7]=> "media/urban/The Other Side.png" 
[8]=> "media/urban/Pharm Child.png" 
[9]=> "media/urban/Amsterdam.png" 
[10]=> "media/urban/obstructed.png" 
} 

它们现在按照它们的目录分组,但是在它们的目录中它们保持它们相对于彼此的顺序。

+2

你的意思是,保持键相同,但阿尔法值进行排序? – Petah 2011-06-08 04:47:16

+0

不,键是不重要的,只是值 – headShrinker 2011-06-08 04:49:31

+0

你是如何使数组...从数据库? – 2011-06-08 04:50:44

回答

1

这不是很直接,因为所有的PHP排序函数只按键或值排序(据我所知)。但所需的信息在关键和价值上。因此,您需要先修改数组,然后进行排序,然后再将其更改为只包含文件名。

function sort_files(array &$files) 
{ 
    /* add extended info: 
     0: index (original order) 
     1: dir name 
     2: original file name */ 
    $i = 0; 
    $files = array_map(function($name) use (&$i) { 
    return array($i++, dirname($name), $name); 
    }, $files); 

    /* sort extended array by dir then index */ 
    usort($files, function($a, $b) { 
    $cmp = strcmp($a[1], $b[1]); 
    if (!$cmp) $cmp = $a[0] - $b[0]; 
    return $cmp; 
    }); 

    /* remove extended info from array */ 
    $files = array_map(function($a) { 
    return $a[2]; 
    }, $files); 
} 

sort_files($files); 

输出:

Array 
(
    [0] => media/abstract/safe.png 
    [1] => media/abstract/fractal_twins.png 
    [2] => media/food/DSC_3017.png 
    [3] => media/nature/creep.png 
    [4] => media/nature/middletown_dreams.png 
    [5] => media/urban/Cross Street 2.png 
    [6] => media/urban/The Other Side.png 
    [7] => media/urban/Pharm Child.png 
    [8] => media/urban/Amsterdam.png 
    [9] => media/urban/obstructed.png 
) 
+0

这将工作,谢谢。我必须承认,没想到它会如此复杂。我想我是对的。谢谢你的帮助。 – headShrinker 2011-06-08 14:39:19

相关问题