在小组中分组并保持秩序的最佳方法是什么?
我有一个充满文件目录路径的数组。数组文件路径按文件创建日期排序。
我想按照创建日期的顺序保存文件,但也按照它们所在目录的顺序对文件进行分组。
示例:
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"
}
现在,它们按目录分组,但在目录中,它们相对于彼此保持顺序。
答案 0 :(得分: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
)