Группировка значений массива при поддержании порядка внутри группы? - PullRequest
1 голос
/ 08 июня 2011

Каков наилучший способ группировки и поддержания порядка в группах?

У меня есть массив, полный путей к файлам. Пути к файлам массивов упорядочены по датам создания файлов.

Я хочу сохранить файлы в порядке даты создания, а также сгруппировать их в порядке, в котором они находятся.

Пример:

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

Теперь они сгруппированы по своим каталогам, но в своих каталогах они поддерживают свой порядок относительно друг друга.

1 Ответ

1 голос
/ 08 июня 2011

Это не совсем просто, потому что все функции сортировки 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...