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排序吗?不,键不重要,只是值显示你制作了数组。。。从数据库?是的,扫描目录中的图像,然后将它们转储到数据库。那会有用的,谢谢。我必须承认,没想到会这么复杂。我想我问得对。谢谢你的帮助。那会有用的,谢谢。我必须承认,没想到会这么复杂。我想我问得对。谢谢你的帮助。