【问题标题】:Grouping Array values while maintaining order within group?在保持组内顺序的同时对数组值进行分组?
【发布时间】:2011-06-08 13:08:30
【问题描述】:

什么是分组并仍然保持分组的最佳方式?

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

我想按创建日期的顺序保存文件,但也按它们所在目录的顺序对它们进行分组。

例子:

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"
}

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

【问题讨论】:

  • 你的意思是,保持键相同,但对值进行 alpha 排序?
  • 不,键不重要,值很重要
  • 你是如何从 db 中制作数组的?
  • 是的,扫描目录中的图像,然后将它们转储到数据库。

标签: php sorting


【解决方案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
)

【讨论】:

  • 那行得通,谢谢。我必须承认,没想到会这么复杂。我想我问得对。感谢您的帮助。
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2020-03-08
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多