Php 在维护组内顺序的同时对数组值进行分组?
什么是分组的最佳方式,并且仍然保持分组中的秩序 我有一个满是文件目录路径的数组。阵列文件路径按文件创建日期排序 我想按照创建日期的顺序保存这些文件,但也要按照它们所在的目录对它们进行分组 例如:Php 在维护组内顺序的同时对数组值进行分组?,php,sorting,Php,Sorting,什么是分组的最佳方式,并且仍然保持分组中的秩序 我有一个满是文件目录路径的数组。阵列文件路径按文件创建日期排序 我想按照创建日期的顺序保存这些文件,但也要按照它们所在的目录对它们进行分组 例如: array() { [1]=> "media/abstract/safe.png" [2]=> "media/urban/Cross Street 2.png" [4]=> "media/urban/The Other Side.png" [5]=> "media/urban/P
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"
}
它们现在是按目录分组的,但在它们的目录中,它们保持着彼此之间的顺序。这不是很简单,因为所有的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
)
这并不十分简单,因为所有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
)
你的意思是,保持键不变,但对值进行alpha排序?不,键并不重要,只是值显示你制作了数组。。。从db?是的,扫描目录中的图像,然后将它们转储到db。你的意思是,保持键不变,但对值进行alpha排序吗?不,键不重要,只是值显示你制作了数组。。。从数据库?是的,扫描目录中的图像,然后将它们转储到数据库。那会有用的,谢谢。我必须承认,没想到会这么复杂。我想我问得对。谢谢你的帮助。那会有用的,谢谢。我必须承认,没想到会这么复杂。我想我问得对。谢谢你的帮助。